国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - IOS - 詳解iOS中跨頁面狀態同步方案比較

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

2021-05-27 16:26Tpphha IOS

這篇文章主要介紹了詳解iOS中跨頁面狀態同步方案比較,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

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

notificationcenter

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

  1. 定義通知名字,以及需要額外傳遞信息的 key
  2. 基于 target-action 的方式注冊通知
?
1
open func addobserver(_ observer: any, selector aselector: selector, name aname: nsnotification.name?, object anobject: any?)

實現監聽通知的方法

?
1
func onreceivednotification(note: nsnotification)

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

?
1
open func post(name aname: nsnotification.name, object anobject: any?, userinfo auserinfo: [anyhashable : any]? = nil)

移除注冊的通知

?
1
open func removeobserver(_ observer: any, name aname: nsnotification.name?, object anobject: any?)

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

?
1
open func addobserver(forname name: nsnotification.name?, object obj: any?, queue: operationqueue?, using block: @escaping (notification) -> void) -> nsobjectprotocol

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

?
1
2
3
4
5
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 中取出所需要的值:

?
1
2
let following = notification.userinfo["followingkey"] as! nsnumber
let userid = notification.userinfo["useridkey"] as! nsnumber;

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

swiftnotificationcenter

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

定義協議

?
1
2
3
protocol followingchanged {
  func followingdidchange(following: bool, userid: nsnumber)
}

基于協議注冊通知

?
1
broadcaster.register(update.self, observer: observer)

實現協議方法

?
1
2
3
4
5
extension viewcontroller: followingchanged {
 func followingdidchange(following: bool, userid: nsnumber) {
  // do something
 }
}

發送通知

?
1
2
3
broadcaster.notify(followingchanged.self) {
  $0.followingdidchange(following, userid)
}

移除注冊的通知

?
1
broadcaster.unregister(update.self, observer: observer)

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

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

?
1
2
3
protocol followingchanging {
  func followingdidchange(following: bool, userid: nsnumber, followingeachother: nsnumber?)
}

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

eventbus

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

 

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

 

圖片來源:eventbus

使用方式如下:

定義事件

?
1
2
3
4
class tpfollowingchangedevent: nsobject, tpevent {
    private(set) var following: bool
        private(set) var userid: nsnumber
}

注冊事件

?
1
tpeventbus<tpfollowingchangedevent>.shared.register(eventtype: tpfollowingchangedevent.self, subscriber: self, selector: #selector(onevent(event:object:)))

實現監聽事件的方法

?
1
2
3
@objc func onevent(event: tpfollowingchangedevent, object: any?) {
    // do something
}

發送事件

?
1
tpeventbus.shared.post(event: event, object: self)

移除事件的注冊

?
1
tpeventbus<tpfollowingchangedevent>.shared.unregister(eventtype: tpfollowingchangedevent.self, subscriber: self)

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

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

?
1
2
3
4
5
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 監聽的方式,并且同樣讓其能夠自動移除事件的注冊。類似于如下的使用方式:

?
1
2
3
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:。

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

原文鏈接:https://juejin.im/post/5d88e7176fb9a06acd456067

延伸 · 閱讀

精彩推薦
  • IOSiOS開發技巧之狀態欄字體顏色的設置方法

    iOS開發技巧之狀態欄字體顏色的設置方法

    有時候我們需要根據不同的背景修改狀態欄字體的顏色,下面這篇文章主要給大家介紹了關于iOS開發技巧之狀態欄字體顏色的設置方法,文中通過示例代碼...

    夢想家-mxj8922021-05-10
  • IOSiOS中UILabel實現長按復制功能實例代碼

    iOS中UILabel實現長按復制功能實例代碼

    在iOS開發過程中,有時候會用到UILabel展示的內容,那么就設計到點擊UILabel復制它上面展示的內容的功能,也就是Label長按復制功能,下面這篇文章主要給大...

    devilx12792021-04-02
  • IOSiOS中滑動控制屏幕亮度和系統音量(附加AVAudioPlayer基本用法和Masonry簡單使用)

    iOS中滑動控制屏幕亮度和系統音量(附加AVAudioPlayer基本用法和

    這篇文章主要介紹了iOS中滑動控制屏幕亮度和系統音量(附加AVAudioPlayer基本用法和Masonry簡單使用)的相關資料,需要的朋友可以參考下...

    CodingFire13652021-02-26
  • IOSiOS開發之視圖切換

    iOS開發之視圖切換

    在iOS開發中視圖的切換是很頻繁的,獨立的視圖應用在實際開發過程中并不常見,除非你的應用足夠簡單。在iOS開發中常用的視圖切換有三種,今天我們將...

    執著丶執念5282021-01-16
  • IOS詳解iOS中多個網絡請求的同步問題總結

    詳解iOS中多個網絡請求的同步問題總結

    這篇文章主要介紹了詳解iOS中多個網絡請求的同步問題總結,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧...

    liang199111312021-03-15
  • IOSiOS實現控制屏幕常亮不變暗的方法示例

    iOS實現控制屏幕常亮不變暗的方法示例

    最近在工作中遇到了要將iOS屏幕保持常亮的需求,所以下面這篇文章主要給大家介紹了關于利用iOS如何實現控制屏幕常亮不變暗的方法,文中給出了詳細的...

    隨風13332021-04-02
  • IOSiOS中MD5加密算法的介紹和使用

    iOS中MD5加密算法的介紹和使用

    MD5加密是最常用的加密方法之一,是從一段字符串中通過相應特征生成一段32位的數字字母混合碼。對輸入信息生成唯一的128位散列值(32個字符)。這篇文...

    LYSNote5432021-02-04
  • IOSiOS自定義UICollectionViewFlowLayout實現圖片瀏覽效果

    iOS自定義UICollectionViewFlowLayout實現圖片瀏覽效果

    這篇文章主要介紹了iOS自定義UICollectionViewFlowLayout實現圖片瀏覽效果的相關資料,需要的朋友可以參考下...

    jiangamh8882021-01-11
主站蜘蛛池模板: 国产福利视频在线观看 | 91精品国产福利在线观看 | 亚洲免费人成在线视频观看 | 97超碰免费 | 五月天婷婷在线视频 | 国产免费天天看高清影视在线 | 国产二区视频 | 不卡中文一区 | 久久夜视频 | 国产成人精品免费 | 黄色直接看 | 国产一级在线 | 国产精品二区一区二区aⅴ污介绍 | 久久久精品综合 | 成人免费的视频 | 少妇精品久久久久久久久久 | 91精品免费 | 久久精品一区二区三区四区 | 欧美中文一区二区三区 | 日韩午夜在线 | 午夜视频在线看 | 日韩午夜电影 | 国产精品毛片一区二区三区 | 亚洲成av在线 | 91精品一区二区三区久久久久久 | 精品久久一区二区三区 | 动漫羞免费网站中文字幕 | 久久久久久亚洲精品中文字幕 | 国产欧美精品区一区二区三区 | 国产精品女教师av久久 | 日韩精品 电影一区 亚洲 | av网站网址 | 一区二区三区四区精品 | 91精品国产综合久久久久久丝袜 | 黄色免费在线观看 | 欧美精品xx| 国产精品二区三区 | 欧洲av一区二区 | 香蕉av影院| 天天精品 | 欧美一区三区 |