【问题标题】:Design pattern with delegate being used by multiple class多个类使用委托的设计模式
【发布时间】:2016-05-18 08:43:47
【问题描述】:

我想通过委托方法将数据从一个类发送到其他类。但是我发现了一个问题,对于每个需要监听数据变化的类,我必须为它们创建一个单独的委托协议。

protocol MainDelegateForA {
  func mainResultObtained(result: String)
}

protocol MainDelegateForB {
  func mainResultObtained(result: String)
}

class MainViewController: UIViewController {

  var delegateForA: MainDelegateForA?
  var delegateForB: MainDelegateForB?

  override func viewDidLoad() {
    let subscribingViewA = SubscribingViewA()
    delegateForA = subscribingViewA
    let subscribingViewB = SubscribingViewB()
    delegateForB = subscribingViewB
    distributeResult("Calculation obtained!!!")
  }

  func distributeResult(result: String) {
    delegateForA?.mainResultObtained(result)
    delegateForB?.mainResultObtained(result)
  }

}

class SubscribingViewA: MainDelegateForA {

  func mainResultObtained(result: String) {
    print("SubscribingViewA got result:\(result)")
  }

}

class SubscribingViewB: MainDelegateForB {

  func mainResultObtained(result: String) {
    print("SubscribingViewA got result:\(result)")
  }

}

上面的代码是我的意思的过度简化版本。

当然是

保留每个类的引用,并通过直接调用该类的公共方法发送结果

使用通知,让每个需要更改的类都能监听数据的变化

可能是解决方案之一,但

我特别想用委托方法写这个

如果可能的话,我是否可以在没有为每个类单独的协议的情况下实现这一点?

【问题讨论】:

  • 你为什么不使用像var delegates = [MainDelegateForA]()这样的代表数组?
  • 我第二点,数组应该可以帮助你实现你正在寻找的东西
  • @luk2302,这似乎是一个很好的方法,但我在我的问题中遗漏了(抱歉 - 过于简化)SubscribingViewA 和 SubscribingViewB 实际上是 UITableViewCell,它们将在 cellForRowAtIndexPath 中创建。如果我将其保留为数组,则当用户不断滚动时,数组会很大
  • 这很好,也许Set 会是更好的选择。 或者您设法取消订阅单元格。
  • 请记住,通常您希望引用代理 weak 以避免引用循环。

标签: objective-c swift design-patterns delegates protocols


【解决方案1】:

正如luk2302所指出的,你可以使用一个委托数组来实现它:

var delegates = [MainDelegate]()

那么你只需要使用一个循环(也许它可以在swift中简化):

for delegate in self.delegates {
    delegate.mainResultObtained(result)
}

【讨论】:

    【解决方案2】:

    您可以使用几种模式。

    1) 您可以允许多个侦听器,并让它们以与 target-action 的工作方式大致相同的方式注册。您的类将遍历侦听器数组并调用适当的方法。

    2) 您可以改用通知。

    我倾向于第一种方法,因为它提供了更多的编程安全性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多