在开源库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
(本人是新接触swift,如果有更好的方法,欢迎留言给我)
新闻热点
疑难解答