iOS中通常的delegate模式只能有一個被委托的對象,這樣當需要有多個被委托的對象時,實現起來就略為麻煩,在開源庫XMPPFramework中提供了一個GCDMulticastDelegate類,使用它可以為一個對象添加多個被委托的對象,用起來也比較方便,用法簡單小結如下:
(1)定義一個協議:
@protocol MyDelegate
@optional
-(void)test;
@end
(2)在需要使用delegate的類中定義一個GCDMulticastDelegate變量
@interface ViewController : UIViewController
{
GCDMulticastDelegate<MyDelegate> *multiDelegate;
}
(3)定義多個實現了協議MyDelegate的類,如Object1和Object2;
(4)在需要使用delegate的地方使用如下代碼,將多個被委托的對象,添加到multiDelegate的delegate鏈中。
- (void)viewDidLoad
{
multiDelegate = (GCDMulticastDelegate <MyDelegate> *)[[GCDMulticastDelegatealloc] init];
Object1 *o1 = [[Object1 alloc]init];
Object2 *o2 = [[Object2 alloc]init];
[multiDelegate addDelegate:o1 delegateQueue:dispatch_get_main_queue()];
[multiDelegate addDelegate:o2 delegateQueue:dispatch_get_main_queue()];
[multiDelegate test1];
}
多播的delegate與通常的delegate不同,multiDelegate並沒有實現協議中的方法,而是將協議中的方法轉發到自己delegate鏈中的對象。 對multiDelegate對象調用test1方法時,由於GCDMulticastDelegate沒有實現test1方法,因此該類的forwardInvocation函數會被觸發,在該函數中會遍歷delegate鏈,對每一個delegate對象調用test1方法,從而實現了多個delegate。同時,在對multiDelegate調用協議方法時,采用的是異步的方式,協議方法會立刻返回,不會阻礙當前函數。