【发布时间】: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