作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我想在事情发生变化时使用多播委托(delegate)来通知多个对象。我读过的解释这一点的教程有一个协议(protocol),该协议(protocol)只有一个直接在委托(delegate)数组上调用的函数。当只定义一个函数时,这很好用。我的协议(protocol)有 6 个功能。我想避免创建 6 个单独的函数并重用一个可应用于我的委托(delegate)数组的函数。
简单示例:(我知道这是行不通的,但我只是想传达我的想法。
protocol MyProtocol {
func method1()
func method2()
func method3()
}
class TestClass {
var delegates = [MyProtocol]()
func invokeDelegates(delegateMethod: () -> ()) {
for delegate in delegates {
delegate.delegateMethod()
}
}
}
明显的问题是编译器提示原始协议(protocol)中没有定义“delegateMethod”。有没有一种方法可以将方法转换为 MyProtocol 的一部分并且编译器会信任我?
这可能吗?
最佳答案
这是我在我的项目中使用的多播委托(delegate)模式的要点。它还可以防止出现强引用循环(内存泄漏)。 WeakWrapper 处理这个。
好的。在某些解决方案中,我看到了错误(强保留循环、竞争条件……)
这是我根据 1 天的研究得出的结果。对于委托(delegate)堆栈,我使用了 NSHashTable,因此所有委托(delegate)都具有弱引用。
class MulticastDelegate <T> {
private let delegates: NSHashTable<AnyObject> = NSHashTable.weakObjects()
func add(delegate: T) {
delegates.add(delegate as AnyObject)
}
func remove(delegate: T) {
for oneDelegate in delegates.allObjects.reversed() {
if oneDelegate === delegate as AnyObject {
delegates.remove(oneDelegate)
}
}
}
func invoke(invocation: (T) -> ()) {
for delegate in delegates.allObjects.reversed() {
invocation(delegate as! T)
}
}
}
func += <T: AnyObject> (left: MulticastDelegate<T>, right: T) {
left.add(delegate: right)
}
func -= <T: AnyObject> (left: MulticastDelegate<T>, right: T) {
left.remove(delegate: right)
}
如何设置委托(delegate):
object.delegates.add(delegate: self)
如何在委托(delegate)上执行功能:而不是
delegate?.delegateFunction
你用
delegates.invoke(invocation: { $0.delegateFunction })
关于ios - swift : Create a multi-function multicast delegate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41552754/
我是一名优秀的程序员,十分优秀!