RxSwiftNotificationCenter的使用和自定義

      網友投稿 1040 2022-05-28

      一、系統通知的注冊與響應

      ① 監聽應用進入后臺的通知

      現有如下需求:程序編譯運行后,當按下設備的 home 鍵,程序進入后臺的同時會在控制臺中輸出相關信息。

      程序進入后臺時除了會執行 AppDelegate.swift 里的 applicationDidEnterBackground 方法外,還會發送 UIApplicationDidEnterBackground 通知,這里可以使用 NotificationCenter 的 Rx 擴展方法來監聽這個通知。

      關于 .takeUntil(self.rx.deallocated):它的作用是保證頁面銷毀的時候自動移除通知注冊,避免內存浪費或出現奔潰。

      // 監聽應用進入后臺通知 _ = NotificationCenter.default.rx .notification(NSNotification.Name.UIApplicationDidEnterBackground) .takeUntil(self.rx.deallocated) // 頁面銷毀自動移除通知監聽 .subscribe(onNext: { _ in print("程序進入到后臺") })

      1

      2

      3

      4

      5

      6

      7

      運行結果:

      程序進入到后臺

      1

      ② 監聽鍵盤的通知

      分別監聽虛擬鍵盤的打開和關閉通知,并在控制臺中輸出相關信息:

      // 添加文本輸入框 let textField = UITextField(frame: CGRect(x:20, y:100, width:200, height:30)) textField.borderStyle = .roundedRect textField.returnKeyType = .done self.view.addSubview(textField) // 點擊鍵盤上的完成按鈕后,收起鍵盤 textField.rx.controlEvent(.editingDidEndOnExit) .subscribe(onNext: { _ in // 收起鍵盤 textField.resignFirstResponder() }) .disposed(by: disposeBag) // 監聽鍵盤彈出通知 _ = NotificationCenter.default.rx .notification(NSNotification.Name.UIKeyboardWillShow) .takeUntil(self.rx.deallocated) // 頁面銷毀自動移除通知監聽 .subscribe(onNext: { _ in print("鍵盤出現") }) // 監聽鍵盤隱藏通知 _ = NotificationCenter.default.rx .notification(NSNotification.Name.UIKeyboardWillHide) .takeUntil(self.rx.deallocated) // 頁面銷毀自動移除通知監聽 .subscribe(onNext: { _ in print("鍵盤消失") })

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      29

      二、自定義通知的發送與接收

      定義一個 MyObserver.swift(觀察者在收到通知后的執行的處理函數中,添加了個 3 秒的等待),如下:

      class MyObserver: NSObject { var name:String = "" init(name:String){ super.init() self.name = name // 接收通知: let notificationName = Notification.Name(rawValue: "DownloadImageNotification") _ = NotificationCenter.default.rx .notification(notificationName) .takeUntil(self.rx.deallocated) // 頁面銷毀自動移除通知監聽 .subscribe(onNext: { notification in // 獲取通知數據 let userInfo = notification.userInfo as! [String: AnyObject] let value1 = userInfo["value1"] as! String let value2 = userInfo["value2"] as! Int print("\(name) 獲取到通知,用戶數據是[\(value1),\(value2)]") // 等待3秒 sleep(3) print("\(name) 執行完畢") }) } }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      發出一個攜帶有自定義數據的通知,同時創建兩個觀察者來接收這個通知:

      let observers = [MyObserver(name: "觀察器1"),MyObserver(name: "觀察器2")] print("發送通知") let notificationName = Notification.Name(rawValue: "DownloadImageNotification") NotificationCenter.default.post(name: notificationName, object: self, userInfo: ["value1":"Kody", "value2" : 123]) print("通知完畢")

      1

      2

      3

      4

      RxSwift之NotificationCenter的使用和自定義

      5

      6

      7

      運行結果如下,可以看出,通知發送后的執行是同步的,也就是說觀察者全部處理完畢后,主線程才繼續往下進行:

      發送通知 觀察器1 獲取到通知,用戶數據是[Kody,123] 觀察器1 執行完畢 觀察器2 獲取到通知,用戶數據是[Kody,123] 觀察器2 執行完畢 通知完畢

      1

      2

      3

      4

      5

      6

      控制臺

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:Java 國王放麥子
      下一篇:官網svn提交到代碼庫,但是不能同步到web目錄
      相關文章
      亚洲精品高清国产麻豆专区| 久久亚洲中文字幕精品有坂深雪| 亚洲精品无码久久毛片波多野吉衣 | 亚洲欧洲在线观看| 亚洲国产一成久久精品国产成人综合 | 亚洲日韩国产一区二区三区在线 | 亚洲国产精品免费观看| 亚洲丰满熟女一区二区v| 亚洲成a人片7777| 亚洲第一网站免费视频| 亚洲国产精品人久久电影| 亚洲中文无码av永久| 456亚洲人成在线播放网站| 亚洲国产乱码最新视频| 亚洲av永久无码精品网址| 成人亚洲国产精品久久| 亚洲国产91精品无码专区| 亚洲日韩在线观看免费视频| 中文字幕不卡亚洲 | 亚洲AV日韩精品久久久久| 亚洲国产无套无码av电影| 亚洲成色WWW久久网站| 亚洲a一级免费视频| 日本久久久久亚洲中字幕| 亚洲精品国产肉丝袜久久| 亚洲av日韩av无码av| 中文字幕乱码亚洲无线三区| 亚洲精华液一二三产区| 亚洲av综合日韩| 亚洲综合精品网站| 亚洲AV永久无码精品| 久久精品国产亚洲AV电影| 亚洲伊人久久大香线蕉结合| 亚洲欧美日韩一区二区三区在线| 亚洲av午夜电影在线观看| 亚洲国产成人精品女人久久久 | 在线亚洲午夜片AV大片| 国产精品亚洲一区二区无码| 国产日产亚洲系列| 亚洲视频精品在线| 亚洲sss综合天堂久久久|