你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> iOS 完成多署理的辦法及實例代碼

iOS 完成多署理的辦法及實例代碼

編輯:IOS開發綜合

IOS完成多署理

甚麼是多署理

用過環信SDK的同窗應當對多署理不生疏了,請看上面代碼:

 @method
 @brief 注冊一個監聽對象到監聽列表中
 @discussion 把監聽對象添加到監聽列表中預備吸收響應的事宜
 @param delegate 須要注冊的監聽對象
 @param queue 告訴監聽對象時的線程
 @result
 */
- (void)addDelegate:(id<EMChatManagerDelegate>)delegate delegateQueue:(dispatch_queue_t)queue;

日常平凡我們寫得比擬多的署理:

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

寫了下面屬性後體系會默許生成set辦法:

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

經由過程對兩個接口的比擬就不好看出:單署理只能設置一個,而多署理可以設置多個,精確來講應當是多署理可以添加多個

多署理有甚麼用

有些同窗能夠會問為何要用多署理?用告訴也能完成多個對象同時監聽啊。是的,用監聽告訴的方法也能到達目標。

舉個例子:辦事端經由過程 socket 傳來一個紅點新聞{"type":21,"content":"某某新聞"},
如今多個頁面都想拿到這個新聞來斷定本身能否須要顯示紅點。

用告訴完成

監聽告訴

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

完成告訴辦法

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

用署理完成

注冊署理

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

完成署理辦法

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

明顯,用署理完成更直不雅清楚明了。

若何完成多署理

下面提到過setDelegate:(id<EMChatManagerDelegate>)delegate的方法是弗成行的,當第二次set的時刻第一次設置的署理就不被持有了。只能經由過程addDelegate:(id<EMChatManagerDelegate>)delegate 這類方法來完成。

是否是有點不淡定了,將署理對象add到數組(或許字典)中,會使對象援用計數+1,招致署理對象不克不及釋放。沒錯,直接把署理加到數組中是弗成行的。然則要持有多個署理對象,又要斟酌到釋放成績怎樣弄。看看日常平凡寫的署理屬性 @property (nonatomic,weak) id<EMChatManagerDelegate>delegate; 忽然想到了用weak潤飾不就好了嗎。

所以,可以經由過程橋接來完成對多個署理對象的持有。

如許就好辦了,數組持有橋接對象,橋接對象再具有本身的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 完成多署理的辦法及實例代碼】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved