前言
在iOS開發(fā)中我們回調(diào)經(jīng)常使用delegete、blcok、通知等方式碘箍。delegete和blcok都是“一對一”回調(diào)辽慕,通知可實(shí)現(xiàn)“一對多”回調(diào)京腥。但是通知有兩個(gè)明顯的弊端:1、不好管理 2溅蛉、傳值只能在userInfo中公浪,這就會(huì)導(dǎo)致傳值類型不明確等問題他宛。
有什么方式即可以“一對多”回調(diào),又可以明確回調(diào)參數(shù)類型呢欠气!答案是有的厅各,就是我們今天介紹的GCDMulticastDelegate
1、GCDMulticastDelegate介紹
GitHub上的介紹:GCDMulticastDelegate extracted from XMPPFramework预柒。
GCDMulticastDelegate是從XMPPFramework提取出來的队塘,主要就是為了實(shí)現(xiàn)多播委托。
2宜鸯、GCDMulticastDelegate導(dǎo)入
pod 'GCDMulticastDelegate'
但是如果我們項(xiàng)目中已經(jīng)
pod 'XMPPFramework'
就無需單獨(dú)pod 'GCDMulticastDelegate'
了憔古。因?yàn)閄MPPFramework里面包含了GCDMulticastDelegate。
3淋袖、GCDMulticastDelegate使用
3.1鸿市、.h文件中
#import <Foundation/Foundation.h>
#import <GCDMulticastDelegate.h>
@protocol HLManagerDelegate<NSObject>
- (void)managerTestMethod;
@end
@interface HLManager : NSObject
{
GCDMulticastDelegate<HLManagerDelegate> *_delegates;
}
+ (instancetype)sharedManager;
/// 添加代理
- (void)addDelegate:(id<HLManagerDelegate>)delegate delegateQueue:(dispatch_queue_t)queue;
/// 刪除代理
- (void)removeDelegate:(id<HLManagerDelegate>)delegate;
@end
3.2、.m文件中
#import "HLManager.h"
static HLManager *manager = nil;
static NSObject *g_lock = nil;
@implementation HLManager
+ (instancetype)sharedManager
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
manager = [[HLManager alloc] init];
});
return manager;
}
- (instancetype)init
{
self = [super init];
if (self) {
_delegates = (GCDMulticastDelegate<HLManagerDelegate> *)[[GCDMulticastDelegate alloc] init];
g_lock = [[NSObject alloc] init];
}
return self;
}
#pragma mark - Public Method
- (void)addDelegate:(id<HLManagerDelegate>)delegate delegateQueue:(dispatch_queue_t)queue
{
@synchronized(g_lock) {
if (!queue) {
queue = dispatch_get_main_queue();
}
[_delegates addDelegate:delegate delegateQueue:queue];
}
}
- (void)removeDelegate:(id<HLManagerDelegate>)delegate
{
if (!delegate) {
return;
}
@synchronized(g_lock) {
[_delegates removeDelegate:delegate];
}
}
@end
3.3即碗、其他類使用HLManagerDelegate
- (void)viewDidLoad {
[super viewDidLoad];
[[HLManager sharedManager] addDelegate:self delegateQueue:dispatch_get_main_queue()];
}
- (void)dealloc {
[[HLManager sharedManager] removeDelegate:self];
}
#pragma mark - HLManagerDelegate
- (void)managerTestMethod
{
NSLog("調(diào)用了managerTestMethod方法");
}
4焰情、總結(jié)
上面簡單演示了GCDMulticastDelegate簡單使用。希望對您有幫助拜姿!