最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

iOS 實現(xiàn)多代理的方法及實例代碼

 更新時間:2016年10月12日 16:58:58   作者:哆啦不能沒有AMen  
這篇文章主要介紹了iOS 實現(xiàn)多代理的方法及實例代碼的相關資料,需要的朋友可以參考下

iOS實現(xiàn)多代理

什么是多代理

用過環(huán)信SDK的同學應該對多代理不陌生了,請看下面代碼:

 @method
 @brief 注冊一個監(jiān)聽對象到監(jiān)聽列表中
 @discussion 把監(jiān)聽對象添加到監(jiān)聽列表中準備接收相應的事件
 @param delegate 需要注冊的監(jiān)聽對象
 @param queue 通知監(jiān)聽對象時的線程
 @result
 */
- (void)addDelegate:(id<EMChatManagerDelegate>)delegate delegateQueue:(dispatch_queue_t)queue;

平時我們寫得比較多的代理:

@property (nonatomic,weak) id<EMChatManagerDelegate>delegate;

寫了上面屬性后系統(tǒng)會默認生成set方法:

- (void)setDelegate:(id<EMChatManagerDelegate>)delegate;

通過對兩個接口的比較就不難看出:單代理只能設置一個,而多代理可以設置多個,準確來說應該是多代理可以添加多個

多代理有什么用

有些同學可能會問為什么要用多代理?用通知也能實現(xiàn)多個對象同時監(jiān)聽啊。是的,用監(jiān)聽通知的方式也能達到目的。

舉個例子:服務端通過 socket 傳來一個紅點消息{"type":21,"content":"某某消息"},
現(xiàn)在多個頁面都想拿到這個消息來判斷自己是否需要顯示紅點。

用通知實現(xiàn)

監(jiān)聽通知

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onReceiveMsg:) name:@"kNotificationName_OnReceiveRedPointMsg" object:nil];

實現(xiàn)通知方法

- (void)onReceiveRedPointMsg:(NSNotification *)noti {
  NSDictionary *info = noti.userInfo;
  if ([info[@"type"] integerValue] == 21) {
    <#code#>
  }
}

用代理實現(xiàn)

注冊代理

[[RedPointManager sharedInstance] addDelegate:<#(id<RedPointManagerDelegate>)#>]

實現(xiàn)代理方法

- (void)redPointManagerDidReceive:(RedPointModel *)redPointModel {
  if (redPointModel.type == 21) {
    <#code#>
  }
}

顯然,用代理實現(xiàn)更直觀明了。

如何實現(xiàn)多代理

上面提到過setDelegate:(id<EMChatManagerDelegate>)delegate的方式是不可行的,當?shù)诙蝧et的時候第一次設置的代理就不被持有了。只能通過addDelegate:(id<EMChatManagerDelegate>)delegate 這種方式來實現(xiàn)。

是不是有點不淡定了,將代理對象add到數(shù)組(或者字典)中,會使對象引用計數(shù)+1,導致代理對象不能釋放。沒錯,直接把代理加到數(shù)組中是不可行的。但是要持有多個代理對象,又要考慮到釋放問題怎么搞??纯雌綍r寫的代理屬性 @property (nonatomic,weak) id<EMChatManagerDelegate>delegate; 突然想到了用weak修飾不就行了嗎。

所以,可以通過橋接來實現(xiàn)對多個代理對象的持有。

這樣就好辦了,數(shù)組持有橋接對象,橋接對象再擁有自己的delegate。

class WeakObjectBridge : NSObject {
  weak var weakObject : AnyObject?
  override init() {
    super.init()
  }
  init(object:AnyObject?) {
    super.init()
    weakObject = object
  }
}

操作代理

func operatDelegate(cb: @escaping (_ delegate:AnyObject?) -> ()){
    for weakObjectBridge in self.delegateBridges {
      DispatchQueue.main.async {
        cb(weakObjectBridge.weakObject)
      }
    }
  }

具體調用

func action() {
    operatDelegate { (delegate) in
      if let myDelegate = delegate as? SomeManagerDelegate {
        myDelegate.callBack()
        myDelegate.callback?(msg: ["msg":"hello world!"])
      }
    }
  }

Demo演示

   Demo下載

點擊這里下載demo.

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關文章

  • iOS系統(tǒng)的底層通知框架庫示例詳解

    iOS系統(tǒng)的底層通知框架庫示例詳解

    這篇文章主要給大家介紹了關于iOS系統(tǒng)的底層通知框架庫的相關資料,文中通過示例代碼介紹的非常詳細,對各位iOS開發(fā)者們具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-05-05
  • IOS 禁止縮放頁面的實現(xiàn)方法

    IOS 禁止縮放頁面的實現(xiàn)方法

    這篇文章主要介紹了IOS 禁止縮放頁面的實現(xiàn)方法的相關資料,這里主要介紹了IOS 10如何通過設置來實現(xiàn)禁止縮放及實現(xiàn)方法,需要的朋友可以參考下
    2017-07-07
  • IOS開發(fā)UIButton(左邊圖片右邊文字效果)

    IOS開發(fā)UIButton(左邊圖片右邊文字效果)

    本篇文章主要實現(xiàn)了實現(xiàn)UIButton左邊圖片,圖片后面緊跟文字效果,類似微信發(fā)現(xiàn)功能,有需要的朋友可以了解一下。
    2016-10-10
  • iOS中如何獲取某個視圖的截圖詳析

    iOS中如何獲取某個視圖的截圖詳析

    這篇文章主要給大家介紹了關于在iOS中如何獲取某個視圖的截圖的相關資料,文中通過示例代碼介紹的非常詳細,對各位iOS開發(fā)者們有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-07-07
  • iOS用兩行代碼完美解決數(shù)據(jù)持久化

    iOS用兩行代碼完美解決數(shù)據(jù)持久化

    所謂的持久化,就是將數(shù)據(jù)保存到硬盤中,使得在應用程序或機器重啟后可以繼續(xù)訪問之前保存的數(shù)據(jù)。在iOS開發(fā)中,有很多數(shù)據(jù)持久化的方案,接下來我將嘗試著介紹一種巧妙的方法,用兩行代碼解決這個問題,一起來學習下。
    2016-08-08
  • iOS WKWebview 白屏檢測實現(xiàn)的示例

    iOS WKWebview 白屏檢測實現(xiàn)的示例

    這篇文章主要介紹了iOS WKWebview 白屏檢測實現(xiàn)的示例,幫助大家更好的進行ios開發(fā),感興趣的朋友可以了解下
    2020-10-10
  • iOS內存管理引用計數(shù)示例分析

    iOS內存管理引用計數(shù)示例分析

    這篇文章主要為大家介紹了iOS內存管理引用計數(shù)示例分析詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • 詳解iOS應用的設計模式開發(fā)中Mediator中介者模式的使用

    詳解iOS應用的設計模式開發(fā)中Mediator中介者模式的使用

    這篇文章主要介紹了iOS應用的設計模式開發(fā)中Mediator中介者模式的使用,示例代碼為傳統(tǒng)的Objective-C語言,需要的朋友可以參考下
    2016-03-03
  • iOS開發(fā)實現(xiàn)圖片瀏覽功能

    iOS開發(fā)實現(xiàn)圖片瀏覽功能

    這篇文章主要為大家詳細介紹了iOS開發(fā)實現(xiàn)圖片瀏覽功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • iOS啟動頁倒計時跳過按鈕功能

    iOS啟動頁倒計時跳過按鈕功能

    這篇文章主要介紹了iOS啟動頁倒計時跳過按鈕功能,需要的朋友可以參考下
    2017-07-07

最新評論

龙门县| 常熟市| 巧家县| 肥乡县| 柳林县| 贡觉县| 那坡县| 大洼县| 思茅市| 富宁县| 鹿邑县| 沙雅县| 黎川县| 连平县| 满洲里市| 慈溪市| 遵义市| 晋江市| 荔浦县| 包头市| 永年县| 荃湾区| 三明市| 东乡县| 临西县| 商丘市| 松潘县| 高台县| 大宁县| 赤水市| 乐东| 宁晋县| 吉首市| 廊坊市| 大新县| 颍上县| 磴口县| 西吉县| 红原县| 灵台县| 琼结县|