iOS中一般的delegate模式只能有一個被委託的對象,這樣當須要有多個被委託的對象時,實現起來就略爲麻煩,在開源庫XMPPFramework中提供了一個GCDMulticastDelegate類,使用它能夠爲一個對象添加多個被委託的對象,用起來也比較方便,用法簡單小結以下:異步
(1)定義一個協議:函數
@protocol MyDelegatespa
@optional對象
-(void)test;get
@endit
(2)在須要使用delegate的類中定義一個GCDMulticastDelegate變量io
@interface ViewController : UIViewControllerast
{class
GCDMulticastDelegate<MyDelegate> *multiDelegate;test
}
(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調用協議方法時,採用的是異步的方式,協議方法會馬上返回,不會阻礙當前函數。