gpt4 book ai didi

ios - swift : Create a multi-function multicast delegate

转载 作者:搜寻专家 更新时间:2023-10-30 22:01:43 26 4
gpt4 key购买 nike

我想在事情发生变化时使用多播委托(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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com