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