亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

詳解iOS中跨頁面狀態同步方案比較

2020-07-26 02:19:00
字體:
來源:轉載
供稿:網友

由于團隊希望項目能夠去 CoreData 化,而以往狀態同步都是依賴于 CoreData 的NSFetchedResultsController。因此去 CoreData 則必須尋找一種替代方案來進行狀態同步。

NotificationCenter

狀態同步實際是一對多的場景,也就是一個事件可以被多個觀察者監聽到。而蘋果的系統框架自帶的 NotificationCenter 正是用來適配這種場景,并且其也是被系統框架本身及我們開發者大面積使用的。用法如下:

  1. 定義通知名字,以及需要額外傳遞信息的 key
  2. 基于 target-action 的方式注冊通知
open func addObserver(_ observer: Any, selector aSelector: Selector, name aName: NSNotification.Name?, object anObject: Any?)

實現監聽通知的方法

func onReceivedNotification(note: NSNotification)

發送通知,可以傳遞發送通知的對象(object)以及一些額外的信息(userInfo)

open func post(name aName: NSNotification.Name, object anObject: Any?, userInfo aUserInfo: [AnyHashable : Any]? = nil)

移除注冊的通知

open func removeObserver(_ observer: Any, name aName: NSNotification.Name?, object anObject: Any?)

當然 NotificationCenter 也提供了一種更加便利基于 block 的方式注冊監聽通知,其將 2,3 兩個步驟整合為 1 個步驟。

open func addObserver(forName name: NSNotification.Name?, object obj: Any?, queue: OperationQueue?, using block: @escaping (Notification) -> Void) -> NSObjectProtocol

整體流程很清晰,簡單易用,但是卻有一個嚴重的缺點 ―― 弱類型。我們接收到的是一個NSNotification對象。

open class NSNotification : NSObject, NSCopying, NSCoding {  open var name: NSNotification.Name { get }  open var object: Any? { get }  open var userInfo: [AnyHashable : Any]? { get }}

假設我們需要傳遞一個關注狀態改變的信息,那么需要包含關注更改后的狀態以及被關注者的 ID。那么我們需要從 userInfo 中取出所需要的值:

let following = notification.userInfo["FollowingKey"] as! NSNumberlet userID = notification.userInfo["UserIDKey"] as! NSNumber;

也就是說接收通知的一方一般需要要查看文檔才知道怎樣從 userInfo 取值,取的值的類型又是什么。這對于使用是極為不方便的。

SwiftNotificationCenter

SwiftNotificationCenter是一種面向協議的通知中心方案。使用方式如下:

定義協議

protocol FollowingChanged {  func followingDidChange(following: Bool, userID: NSNumber)}

基于協議注冊通知

Broadcaster.register(Update.self, observer: observer)

實現協議方法

extension ViewController: FollowingChanged { func followingDidChange(following: Bool, userID: NSNumber) {  // do something }}

發送通知

Broadcaster.notify(FollowingChanged.self) {  $0.followingDidChange(following, userID)}

移除注冊的通知

Broadcaster.unregister(Update.self, observer: observer)

我們可以看到,其基于協議的方式解決了弱類型的問題,并且其通過AssociatedObject實現了通知的自動移除。但其也存在著擴展性較差的問題。

依然是關注改變的場景,假如隨著業務的發展,有的地方需要知道關注后是否為互關的狀態,那么又需要增加一個字段來標識。因此我們需要修改協議,增加參數,且由于其不是必須傳遞的參數,因此是 optional 類型。

protocol FollowingChanging {  func followingDidChange(following: Bool, userID: NSNumber, followingEachOther: NSNumber?)}

如果在該類型通知被廣泛應用的場景,那么需要修改的地方就尤其多了。這顯然也是難以接受的。

EventBus

EventBus 在安卓中被廣泛地應用,其流程如下圖所示:

圖片來源:EventBus

使用方式如下:

定義事件

 class TPFollowingChangedEvent: NSObject, TPEvent {  	private(set) var following: Bool  		private(set) var userID: NSNumber}

注冊事件

TPEventBus<TPFollowingChangedEvent>.shared.register(eventType: TPFollowingChangedEvent.self, subscriber: self, selector: #selector(onEvent(event:object:)))

實現監聽事件的方法

@objc func onEvent(event: TPFollowingChangedEvent, object: Any?) {  	// do something}

發送事件

TPEventBus.shared.post(event: event, object: self)

移除事件的注冊

TPEventBus<TPFollowingChangedEvent>.shared.unregister(eventType: TPFollowingChangedEvent.self, subscriber: self)

我們可以看到, EventBus 也是強類型的。

假如依然關注的場景,需要增加 followingEachOther 參數,那么我們只需要在 TPFollowingChangedEvent 中增加 followingEachOther 參數即可。如下所示:

class TPFollowingChangedEvent: NSObject, TPEvent {  	private(set) var following: Bool  		private(set) var userID: NSNumber  	private(set) var followingEachOther: NSNumber?}

因此使用 EventBus 實現了以下需求:

  • 強類型
  • 可擴展

EventBus 同 NotificationCenter 都是基于 target-action 的方案,但是我們不難將其擴展為支持 block 監聽的方式,并且同樣讓其能夠自動移除事件的注冊。類似于如下的使用方式:

TPEventBus<TPFollowingChangedEvent>.shared.subscribe(eventType: TPFollowingChangedEvent.self).forObject(self).onQueue(OperationQueue.main).onEvent { (event, object) in   // do something}.disposed(by: self)

基于 OC, 我實現了一個小巧但比較全面的 EventBus 供參考:TPEventBus。

最后

我們可以看到,一對多場景中觀察者模式的應用流程都大同小異,但是如何更好用確是值得深思的。當然以上也只是我在一些使用場景上的思考,肯定會欠缺考慮,歡迎拍磚:blush:。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美大尺度电影在线观看| 亚洲午夜国产成人av电影男同| 国产成人精品电影久久久| 亚洲一区二区免费在线| 欧美综合第一页| 91po在线观看91精品国产性色| 日韩毛片中文字幕| 日韩久久免费电影| 日韩欧美高清在线视频| 国产精品免费久久久久久| 欧美怡红院视频一区二区三区| 亚洲成人网久久久| 国产一区在线播放| 亚洲一区av在线播放| 亚洲最大av网站| 亚洲国产另类久久精品| 91最新在线免费观看| 91大神在线播放精品| 欧美国产日韩xxxxx| 欧美日韩激情视频| 亚洲视频在线播放| 亚洲美女av在线| 亚洲一区二区三区四区视频| 精品综合久久久久久97| 色综合久久天天综线观看| 国产欧美精品在线播放| 黄色成人在线播放| 亚洲电影免费在线观看| 欧美色图在线视频| 国产精品户外野外| 亚洲天堂免费观看| 一区二区三区回区在观看免费视频| 91亚洲人电影| 狠狠躁夜夜躁人人爽天天天天97| 欧美一级黑人aaaaaaa做受| 日韩在线观看免费高清完整版| 亚洲小视频在线| 91成人免费观看网站| 国产精品av网站| 欧美人交a欧美精品| 亚洲成人久久电影| 欧美大片在线看| 国产丝袜一区视频在线观看| 免费不卡在线观看av| 精品久久久久久国产| 亚洲精品视频在线播放| 精品国内自产拍在线观看| 欧美怡红院视频一区二区三区| 日韩欧美国产免费播放| 九九热在线精品视频| 国外日韩电影在线观看| 亚洲视频网站在线观看| 欧美在线播放视频| 2020久久国产精品| 色婷婷av一区二区三区在线观看| 精品国产一区二区三区久久久狼| 日韩在线观看免费网站| 九九九热精品免费视频观看网站| 国产午夜精品理论片a级探花| 久久久女女女女999久久| 国产精品精品久久久久久| 亚洲乱码国产乱码精品精| 亚洲第一中文字幕在线观看| 欧美日本中文字幕| 亚洲精品视频中文字幕| 欧美性猛交xxxx富婆| 亚洲色图校园春色| 91精品久久久久久久久久入口| 九九久久久久99精品| 日韩免费av片在线观看| 国产精品999| 久久夜精品va视频免费观看| 国产精品免费久久久久影院| 国产精品视频在线播放| 久久久久久久色| 伊人av综合网| 日av在线播放中文不卡| 亚洲在线第一页| 亚洲精品一区二区久| 91精品久久久久久久| 久久久久久久一区二区| 欧美在线激情视频| 精品久久香蕉国产线看观看gif| 亚洲免费视频观看| 97久久精品人人澡人人爽缅北| 国产91精品久久久久久久| 成人欧美一区二区三区黑人孕妇| 亚洲精品综合久久中文字幕| 国产亚洲精品美女久久久久| 久久影院在线观看| 国产99久久久欧美黑人| 欧美激情精品久久久久久蜜臀| 美女少妇精品视频| 亚洲天堂男人天堂| 精品国偷自产在线视频| 国产中文日韩欧美| 欧美激情一区二区三区在线视频观看| 91av免费观看91av精品在线| 国产精品久久久久久久久久99| 羞羞色国产精品| 久久久久久久久亚洲| 亚洲精品白浆高清久久久久久| 国产第一区电影| 国产91精品久| 欧美激情日韩图片| 精品久久久久久久久久久久| 国产精品日韩欧美| 国产午夜精品全部视频播放| 自拍偷拍亚洲一区| 久久国产精品网站| yw.139尤物在线精品视频| 久久午夜a级毛片| 中文字幕日韩高清| 亚洲激情在线观看视频免费| 亚洲自拍小视频| 91精品国产综合久久久久久蜜臀| 国产日韩欧美夫妻视频在线观看| 国产成人免费av| 亚洲字幕一区二区| 欧美资源在线观看| 国产精品久久久久久久久久新婚| 亚州成人av在线| 亚洲精品免费在线视频| 亚洲人永久免费| 精品美女永久免费视频| 久久综合五月天| 欧美国产日韩视频| 亚洲日本aⅴ片在线观看香蕉| 日韩精品视频三区| 2020久久国产精品| 欧美大片在线免费观看| 国产精品成人品| 91九色蝌蚪国产| 亚洲欧美国产另类| 欧美成人午夜激情视频| 亚洲国产成人精品女人久久久| 性色av一区二区咪爱| 日韩福利伦理影院免费| 亚洲视频在线看| 亚洲的天堂在线中文字幕| 97超级碰碰碰久久久| 国产成人av在线| 国产精品99久久99久久久二8| 亚洲欧洲在线看| 久久久免费精品| 91精品国产91久久久久久久久| 亚洲女性裸体视频| 国产欧美在线观看| 久久99热精品这里久久精品| 亚洲精品自拍第一页| 欧美激情中文字幕乱码免费| 欧美激情视频在线观看| 欧美精品性视频| 欧美日韩综合视频网址| 色阁综合伊人av| 亚洲成人黄色在线观看| 亚洲第一页中文字幕| 中文字幕欧美精品日韩中文字幕| 一区二区三区四区在线观看视频| 亚洲精品视频久久| 国产一区二区三区四区福利| 久久久久久久999精品视频| 国产精品免费电影| 亚洲精品视频播放|