草庐IT

ios - swift : Create a multi-function multicast delegate

coder 2023-09-04 原文

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

有关ios - swift : Create a multi-function multicast delegate的更多相关文章

随机推荐