本篇文章為大家展示了iOS中怎么實(shí)現(xiàn)跨頁面狀態(tài)同步,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。
成都創(chuàng)新互聯(lián)是一家專注于網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)與策劃設(shè)計(jì),銅鼓網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)十載,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:銅鼓等地區(qū)。銅鼓做網(wǎng)站價(jià)格咨詢:18982081108NotificationCenter
狀態(tài)同步實(shí)際是一對多的場景,也就是一個(gè)事件可以被多個(gè)觀察者監(jiān)聽到。而蘋果的系統(tǒng)框架自帶的 NotificationCenter 正是用來適配這種場景,并且其也是被系統(tǒng)框架本身及我們開發(fā)者大面積使用的。用法如下:
定義通知名字,以及需要額外傳遞信息的 key
基于 target-action 的方式注冊通知
open func addObserver(_ observer: Any, selector aSelector: Selector, name aName: NSNotification.Name?, object anObject: Any?)
實(shí)現(xiàn)監(jiān)聽通知的方法
func onReceivedNotification(note: NSNotification)
發(fā)送通知,可以傳遞發(fā)送通知的對象(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?)
當(dāng)然 NotificationCenter 也提供了一種更加便利基于 block 的方式注冊監(jiān)聽通知,其將 2,3 兩個(gè)步驟整合為 1 個(gè)步驟。
open func addObserver(forName name: NSNotification.Name?, object obj: Any?, queue: OperationQueue?, using block: @escaping (Notification) -> Void) -> NSObjectProtocol
整體流程很清晰,簡單易用,但是卻有一個(gè)嚴(yán)重的缺點(diǎn) —— 弱類型。我們接收到的是一個(gè)NSNotification
對象。
open class NSNotification : NSObject, NSCopying, NSCoding { open var name: NSNotification.Name { get } open var object: Any? { get } open var userInfo: [AnyHashable : Any]? { get } }
假設(shè)我們需要傳遞一個(gè)關(guān)注狀態(tài)改變的信息,那么需要包含關(guān)注更改后的狀態(tài)以及被關(guān)注者的 ID。那么我們需要從 userInfo 中取出所需要的值:
let following = notification.userInfo["FollowingKey"] as! NSNumber let userID = notification.userInfo["UserIDKey"] as! NSNumber;
也就是說接收通知的一方一般需要要查看文檔才知道怎樣從 userInfo 取值,取的值的類型又是什么。這對于使用是極為不方便的。
SwiftNotificationCenter
SwiftNotificationCenter是一種面向協(xié)議的通知中心方案。使用方式如下:
定義協(xié)議
protocol FollowingChanged { func followingDidChange(following: Bool, userID: NSNumber) }
基于協(xié)議注冊通知
Broadcaster.register(Update.self, observer: observer)
實(shí)現(xiàn)協(xié)議方法
extension ViewController: FollowingChanged { func followingDidChange(following: Bool, userID: NSNumber) { // do something } }
發(fā)送通知
Broadcaster.notify(FollowingChanged.self) { $0.followingDidChange(following, userID) }
移除注冊的通知
Broadcaster.unregister(Update.self, observer: observer)
我們可以看到,其基于協(xié)議的方式解決了弱類型的問題,并且其通過AssociatedObject
實(shí)現(xiàn)了通知的自動移除。但其也存在著擴(kuò)展性較差的問題。
依然是關(guān)注改變的場景,假如隨著業(yè)務(wù)的發(fā)展,有的地方需要知道關(guān)注后是否為互關(guān)的狀態(tài),那么又需要增加一個(gè)字段來標(biāo)識。因此我們需要修改協(xié)議,增加參數(shù),且由于其不是必須傳遞的參數(shù),因此是 optional 類型。
protocol FollowingChanging { func followingDidChange(following: Bool, userID: NSNumber, followingEachOther: NSNumber?) }
如果在該類型通知被廣泛應(yīng)用的場景,那么需要修改的地方就尤其多了。這顯然也是難以接受的。
EventBus
EventBus 在安卓中被廣泛地應(yīng)用,其流程如下圖所示:
圖片來源: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:)))
實(shí)現(xiàn)監(jiān)聽事件的方法
@objc func onEvent(event: TPFollowingChangedEvent, object: Any?) { // do something }
發(fā)送事件
TPEventBus.shared.post(event: event, object: self)
移除事件的注冊
TPEventBus<TPFollowingChangedEvent>.shared.unregister(eventType: TPFollowingChangedEvent.self, subscriber: self)
我們可以看到, EventBus 也是強(qiáng)類型的。
假如依然關(guān)注的場景,需要增加 followingEachOther 參數(shù),那么我們只需要在 TPFollowingChangedEvent 中增加 followingEachOther 參數(shù)即可。如下所示:
class TPFollowingChangedEvent: NSObject, TPEvent { private(set) var following: Bool private(set) var userID: NSNumber private(set) var followingEachOther: NSNumber? }
因此使用 EventBus 實(shí)現(xiàn)了以下需求:
強(qiáng)類型
可擴(kuò)展
EventBus 同 NotificationCenter 都是基于 target-action 的方案,但是我們不難將其擴(kuò)展為支持 block 監(jiān)聽的方式,并且同樣讓其能夠自動移除事件的注冊。類似于如下的使用方式:
TPEventBus<TPFollowingChangedEvent>.shared.subscribe(eventType: TPFollowingChangedEvent.self).forObject(self).onQueue(OperationQueue.main).onEvent { (event, object) in // do something }.disposed(by: self)
上述內(nèi)容就是iOS中怎么實(shí)現(xiàn)跨頁面狀態(tài)同步,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司行業(yè)資訊頻道。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)建站chinadenli.net,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
文章標(biāo)題:iOS中怎么實(shí)現(xiàn)跨頁面狀態(tài)同步-創(chuàng)新互聯(lián)
網(wǎng)頁網(wǎng)址:http://chinadenli.net/article22/dhjicc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、App設(shè)計(jì)、網(wǎng)站維護(hù)、網(wǎng)站策劃、動態(tài)網(wǎng)站、網(wǎng)站設(shè)計(jì)公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容