真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

iOS中跨頁(yè)面狀態(tài)同步方案分析

這篇文章主要講解了“iOS中跨頁(yè)面狀態(tài)同步方案分析”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“iOS中跨頁(yè)面狀態(tài)同步方案分析”吧!

創(chuàng)新互聯(lián)的客戶來(lái)自各行各業(yè),為了共同目標(biāo),我們?cè)诠ぷ魃厦芮信浜希瑥膭?chuàng)業(yè)型小企業(yè)到企事業(yè)單位,感謝他們對(duì)我們的要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來(lái)驚喜。專業(yè)領(lǐng)域包括成都做網(wǎng)站、成都網(wǎng)站建設(shè)、電商網(wǎng)站開(kāi)發(fā)、微信營(yíng)銷、系統(tǒng)平臺(tái)開(kāi)發(fā)。

NotificationCenter

狀態(tài)同步實(shí)際是一對(duì)多的場(chǎng)景,也就是一個(gè)事件可以被多個(gè)觀察者監(jiān)聽(tīng)到。而蘋果的系統(tǒng)框架自帶的 NotificationCenter 正是用來(lái)適配這種場(chǎng)景,并且其也是被系統(tǒng)框架本身及我們開(kāi)發(fā)者大面積使用的。用法如下:

  1. 定義通知名字,以及需要額外傳遞信息的 key基于 target-action 的方式注冊(cè)通知

open func addObserver(_ observer: Any, selector aSelector: Selector, name aName: NSNotification.Name?, object anObject: Any?)

實(shí)現(xiàn)監(jiān)聽(tīng)通知的方法

func onReceivedNotification(note: NSNotification)

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

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

移除注冊(cè)的通知

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

當(dāng)然 NotificationCenter 也提供了一種更加便利基于 block 的方式注冊(cè)監(jiān)聽(tīng)通知,其將 2,3 兩個(gè)步驟整合為 1 個(gè)步驟。

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

整體流程很清晰,簡(jiǎn)單易用,但是卻有一個(gè)嚴(yán)重的缺點(diǎn) —— 弱類型。我們接收到的是一個(gè)NSNotification對(duì)象。

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! NSNumberlet userID = notification.userInfo["UserIDKey"] as! NSNumber;

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

SwiftNotificationCenter

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

定義協(xié)議

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

基于協(xié)議注冊(cè)通知

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)}

移除注冊(cè)的通知

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

我們可以看到,其基于協(xié)議的方式解決了弱類型的問(wèn)題,并且其通過(guò)AssociatedObject實(shí)現(xiàn)了通知的自動(dòng)移除。但其也存在著擴(kuò)展性較差的問(wèn)題。

依然是關(guān)注改變的場(chǎng)景,假如隨著業(yè)務(wù)的發(fā)展,有的地方需要知道關(guān)注后是否為互關(guān)的狀態(tài),那么又需要增加一個(gè)字段來(lái)標(biāo)識(shí)。因此我們需要修改協(xié)議,增加參數(shù),且由于其不是必須傳遞的參數(shù),因此是 optional 類型。

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

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

EventBus

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

圖片來(lái)源:EventBus

使用方式如下:

定義事件

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

注冊(cè)事件

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

實(shí)現(xiàn)監(jiān)聽(tīng)事件的方法

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

發(fā)送事件

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

移除事件的注冊(cè)

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

我們可以看到, EventBus 也是強(qiáng)類型的。

假如依然關(guān)注的場(chǎng)景,需要增加 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)聽(tīng)的方式,并且同樣讓其能夠自動(dòng)移除事件的注冊(cè)。類似于如下的使用方式:

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

感謝各位的閱讀,以上就是“iOS中跨頁(yè)面狀態(tài)同步方案分析”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)iOS中跨頁(yè)面狀態(tài)同步方案分析這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!


網(wǎng)頁(yè)題目:iOS中跨頁(yè)面狀態(tài)同步方案分析
網(wǎng)頁(yè)地址:http://weahome.cn/article/jjcpid.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部