在開源庫XMPPFramework中提供了一個GCDMulticastDelegate類,使用它可以為一個對象添加多個被委托的對象,以前用oc編寫的工程引入了這個類,使用起來十分方便。最近由於換了工作,新項目需要用swift來實現。我也想把這個對象引入到工程中。仔細研究了一下,終於可以實現了。
1.導入GCDMulticastDelegate類,在橋接文件中加入:#import "GCDMulticastDelegate.h"
2.建立一個swift的代理文件,文件體如下
@objc protocol MyDelegate {
optional func test()
}
注意的是,這裡的代理函數一定要聲明為optional的
3.建立一個新的swift文件,命名為MyMulticastDelegate,文件體如下
import UIKit
class MyMulticastDelegate: GCDMulticastDelegate,MyDelegate {}
表示新類是繼承了GCDMulticastDelegate,並實現了MyDelegate
4.在需要使用multiDelegate發test消息的類中,定義一個實例變量:
var multiDelegate:MyMulticastDelegate
在類的初使化函數裡實例化:
multiDelegate = MyMulticastDelegate()
並在類中定義兩個如下函數:
func addMultiDelegate(delegate:MyDelegate, delegateQueue:dispatch_queue_t){
multiDelegate?.addDelegate(delegate, delegateQueue: delegateQueue)
}
func removeMultiDelegate(delegate:MyDelegate){
multiDelegate?.removeDelegate(delegate)
}
需要發消息時,如下調用:
if let tempMultiDelegate:MyDelegate = self.multiDelegate{
tempMultiDelegate.test!()
}
注意這裡的消息函數後面是!,目的是強制調用GCDMulticastDelegate裡面的forwardInvocation函數。如裡寫成?消息監聽者會收不到消息
5.需要接收test()消息的對象以self為參數調用addMultiDelegate