我正在尝试在 Swift 中实现多播委托功能。在 Objective C 中,我们有这个优秀的实现
https://github.com/robbiehanson/XMPPFramework/blob/master/Utilities/GCDMulticastDelegate.m
我刚刚创建了这个基本功能:
protocol MyProtocol : class{
func testString()-> String;
}
class MulticastDelegateNode <T:AnyObject> {
weak var delegate : T?
init(object : T){
self.delegate = object;
}
}
class MulticastDelegate <T:AnyObject> {
var delegates = Array<MulticastDelegateNode<T>>()
func addDelegate(delegate : T){
var newNode = MulticastDelegateNode(object : delegate);
delegates.append(newNode);
}
func removeDelegate(delegate : AnyObject){
self.delegates = self.delegates.filter({ (node : MulticastDelegateNode) -> Bool in
return node.delegate !== delegate;
});
}
}
class OP {
var delegate = MulticastDelegate<MyProtocol>();
func process(){
//...
//make actions
//notify the objects!
}
}
我的问题是,我似乎无法找到一种方法来做到这一点:
delegate.testString()
为了向节点中的所有委托提供命令“testString()”。谁能帮我这个?
Swift 3执行:
class MulticastDelegate<T> {
private var delegates = [Weak]()
func add(_ delegate: T) {
if Mirror(reflecting: delegate).subjectType is AnyClass {
delegates.append(Weak(value: delegate as AnyObject))
} else {
fatalError("MulticastDelegate does not support value types")
}
}
func remove(_ delegate: T) {
if type(of: delegate).self is AnyClass {
delegates.remove(Weak(value: delegate as AnyObject))
}
}
func invoke(_ invocation: (T) -> ()) {
for (index, delegate) in delegates.enumerated() {
if let delegate = delegate.value {
invocation(delegate as! T)
} else {
delegates.remove(at: index)
}
}
}
}
private class Weak: Equatable {
weak var value: AnyObject?
init(value: AnyObject) {
self.value = value
}
}
private func ==(lhs: Weak, rhs: Weak) -> Bool {
return lhs.value === rhs.value
}
extension RangeReplaceableCollection where Iterator.Element : Equatable {
@discardableResult
mutating func remove(_ element : Iterator.Element) -> Iterator.Element? {
if let index = self.index(of: element) {
return self.remove(at: index)
}
return nil
}
}
您可以使用以下方法进行测试:
protocol SomeDelegate: class {
func onSomeEvent()
}
class SomeDelegateImpl: SomeDelegate {
let value: Int
init(value: Int) {
self.value = value
}
func onSomeEvent() {
print("Invoking delegate \(value)")
}
}
let multicastDelegate = MulticastDelegate<SomeDelegate>()
func testInvoke() {
multicastDelegate.invoke {
$0.onSomeEvent()
}
}
print("Adding first delegate.")
let delegate1 = SomeDelegateImpl(value: 1)
multicastDelegate.add(delegate1)
testInvoke()
let delegate2 = SomeDelegateImpl(value: 2)
print("Adding second delegate.")
multicastDelegate.add(delegate2)
testInvoke()
print("Removing first delegate.")
multicastDelegate.remove(delegate1)
testInvoke()
print("Adding third delegate.")
({
let delegate3 = SomeDelegateImpl(value: 3)
multicastDelegate.add(delegate3)
testInvoke()
})()
print("Third delegate is deallocated by ARC.")
testInvoke()
它打印:
Adding first delegate.
Invoking delegate 1.
Adding second delegate.
Invoking delegate 1.
Invoking delegate 2.
Removing first delegate.
Invoking delegate 2.
Adding third delegate.
Invoking delegate 2.
Invoking delegate 3.
Third delegate is deallocated by ARC.
Invoking delegate 2.
基于这篇博文.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)