在開源庫(kù)XMPPFramework中提供了一個(gè)GCDMulticastDelegate類,使用它可以為一個(gè)對(duì)象添加多個(gè)被委托的對(duì)象,以前用oc編寫的工程引入了這個(gè)類,使用起來(lái)十分方便。最近由于換了工作,新項(xiàng)目需要用swift來(lái)實(shí)現(xiàn)。我也想把這個(gè)對(duì)象引入到工程中。仔細(xì)研究了一下,終于可以實(shí)現(xiàn)了。
1.導(dǎo)入GCDMulticastDelegate類,在橋接文件中加入:#import "GCDMulticastDelegate.h"
2.建立一個(gè)swift的代理文件,文件體如下
@objc PRotocol MyDelegate {
optional func test()
}
注意的是,這里的代理函數(shù)一定要聲明為optional的
3.建立一個(gè)新的swift文件,命名為MyMulticastDelegate,文件體如下
import UIKit
class MyMulticastDelegate: GCDMulticastDelegate,MyDelegate {}
表示新類是繼承了GCDMulticastDelegate,并實(shí)現(xiàn)了MyDelegate
4.在需要使用multiDelegate發(fā)test消息的類中,定義一個(gè)實(shí)例變量:
var multiDelegate:MyMulticastDelegate
在類的初使化函數(shù)里實(shí)例化:
multiDelegate = MyMulticastDelegate()
并在類中定義兩個(gè)如下函數(shù):
func addMultiDelegate(delegate:MyDelegate, delegateQueue:dispatch_queue_t){
multiDelegate?.addDelegate(delegate, delegateQueue: delegateQueue)
}
func removeMultiDelegate(delegate:MyDelegate){
multiDelegate?.removeDelegate(delegate)
}
需要發(fā)消息時(shí),如下調(diào)用:
if let tempMultiDelegate:MyDelegate = self.multiDelegate{
tempMultiDelegate.test!()
}
注意這里的消息函數(shù)后面是!,目的是強(qiáng)制調(diào)用GCDMulticastDelegate里面的forwardInvocation函數(shù)。如里寫成?消息監(jiān)聽者會(huì)收不到消息
5.需要接收test()消息的對(duì)象以self為參數(shù)調(diào)用addMultiDelegate
(本人是新接觸swift,如果有更好的方法,歡迎留言給我)
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注