日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

RxSwift之NotificationCenter的使用和自定义

發(fā)布時間:2024/5/21 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 RxSwift之NotificationCenter的使用和自定义 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、系統(tǒng)通知的注冊與響應(yīng)

① 監(jiān)聽?wèi)?yīng)用進(jìn)入后臺的通知

  • 現(xiàn)有如下需求:程序編譯運(yùn)行后,當(dāng)按下設(shè)備的 home 鍵,程序進(jìn)入后臺的同時會在控制臺中輸出相關(guān)信息。
  • 程序進(jìn)入后臺時除了會執(zhí)行 AppDelegate.swift 里的 applicationDidEnterBackground 方法外,還會發(fā)送 UIApplicationDidEnterBackground 通知,這里可以使用 NotificationCenter 的 Rx 擴(kuò)展方法來監(jiān)聽這個通知。
  • 關(guān)于 .takeUntil(self.rx.deallocated):它的作用是保證頁面銷毀的時候自動移除通知注冊,避免內(nèi)存浪費(fèi)或出現(xiàn)奔潰。
// 監(jiān)聽?wèi)?yīng)用進(jìn)入后臺通知 _ = NotificationCenter.default.rx.notification(NSNotification.Name.UIApplicationDidEnterBackground).takeUntil(self.rx.deallocated) // 頁面銷毀自動移除通知監(jiān)聽.subscribe(onNext: { _ inprint("程序進(jìn)入到后臺")})
  • 運(yùn)行結(jié)果:
程序進(jìn)入到后臺

② 監(jiān)聽鍵盤的通知

  • 分別監(jiān)聽虛擬鍵盤的打開和關(guān)閉通知,并在控制臺中輸出相關(guān)信息:
// 添加文本輸入框 let textField = UITextField(frame: CGRect(x:20, y:100, width:200, height:30)) textField.borderStyle = .roundedRect textField.returnKeyType = .done self.view.addSubview(textField)// 點(diǎn)擊鍵盤上的完成按鈕后,收起鍵盤 textField.rx.controlEvent(.editingDidEndOnExit).subscribe(onNext: { _ in// 收起鍵盤textField.resignFirstResponder()}).disposed(by: disposeBag)// 監(jiān)聽鍵盤彈出通知 _ = NotificationCenter.default.rx.notification(NSNotification.Name.UIKeyboardWillShow).takeUntil(self.rx.deallocated) // 頁面銷毀自動移除通知監(jiān)聽.subscribe(onNext: { _ inprint("鍵盤出現(xiàn)")})// 監(jiān)聽鍵盤隱藏通知 _ = NotificationCenter.default.rx.notification(NSNotification.Name.UIKeyboardWillHide).takeUntil(self.rx.deallocated) // 頁面銷毀自動移除通知監(jiān)聽.subscribe(onNext: { _ inprint("鍵盤消失")})

二、自定義通知的發(fā)送與接收

  • 定義一個 MyObserver.swift(觀察者在收到通知后的執(zhí)行的處理函數(shù)中,添加了個 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) // 頁面銷毀自動移除通知監(jiān)聽.subscribe(onNext: { notification in// 獲取通知數(shù)據(jù)let userInfo = notification.userInfo as! [String: AnyObject]let value1 = userInfo["value1"] as! Stringlet value2 = userInfo["value2"] as! Intprint("\(name) 獲取到通知,用戶數(shù)據(jù)是[\(value1),\(value2)]")// 等待3秒sleep(3)print("\(name) 執(zhí)行完畢")})} }
  • 發(fā)出一個攜帶有自定義數(shù)據(jù)的通知,同時創(chuàng)建兩個觀察者來接收這個通知:
let observers = [MyObserver(name: "觀察器1"),MyObserver(name: "觀察器2")]print("發(fā)送通知") let notificationName = Notification.Name(rawValue: "DownloadImageNotification") NotificationCenter.default.post(name: notificationName, object: self,userInfo: ["value1":"Kody", "value2" : 123]) print("通知完畢")
  • 運(yùn)行結(jié)果如下,可以看出,通知發(fā)送后的執(zhí)行是同步的,也就是說觀察者全部處理完畢后,主線程才繼續(xù)往下進(jìn)行:
發(fā)送通知 觀察器1 獲取到通知,用戶數(shù)據(jù)是[Kody,123] 觀察器1 執(zhí)行完畢 觀察器2 獲取到通知,用戶數(shù)據(jù)是[Kody,123] 觀察器2 執(zhí)行完畢 通知完畢

總結(jié)

以上是生活随笔為你收集整理的RxSwift之NotificationCenter的使用和自定义的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。