我正在测试从初始值设定项运行委托模式。这是我的数据供应商测试类及其数据源:
protocol MyClassDataSource : AnyObject{
func returnString(string: String)
}
protocol MyClassProtocol: AnyObject {
var dataSource : MyClassDataSource? { get set }
}
class MyClass : MyClassProtocol {
weak var dataSource: MyClassDataSource?
init() {
print("1. My Class initialized")
getString()
}
func getString() {
let myString = "Hello World"
print("3. The getString func run")
dataSource?.returnString(string: myString)
}
}
我将数据发送到其他班级。在这里:
class OtherClass : MyClassDataSource {
weak var myClass : MyClassProtocol?
init(myClass: MyClassProtocol?) {
self.myClass = myClass
self.myClass?.dataSource = self
print("2. MyClass delegate set")
}
func returnString(string: String) {
print("4. Delegate run and print the string: \(string)")
}
}
然后我初始化它们:
let myClass = MyClass()
let otherClass = OtherClass(myClass: myClass)
我想创建我的类并将数据从 MyClass 发送到 OtherClass。我想使用 init() 函数将 dataSource 设置为 self 并运行函数并发送数据。当然,这没有用。我期望在控制台中看到打印的内容:
但是 getString() 会在设置或创建 OtherClass 之前立即运行并打印以下内容:
如果我手动延迟 getString() 运行,它会起作用:
func getString() {
let myString = "Hello World"
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { [weak self] in
print("3. The getString func run")
self?.dataSource?.returnString(string: myString)
}
}
所以,我的问题是,我怎样才能让它发挥作用?我可以通过初始化类来设置委托并在它们之间发送数据吗?有可能以某种方式做到吗?
无法在
getString
中呼叫 init
。您希望在调用 getString
之前设置数据源,但是 getString
是在 init
中调用的,因此其他代码没有机会设置数据源。其他代码只能在init
之后设置数据源。
要实现此事件序列,您可以在设置
getString
后立即调用 dataSource
。这是您可以有意义地调用 getString
的最早时间点 - 在此之前的任何时间都不会调用 returnString
。
weak var dataSource: MyClassDataSource? {
didSet { getString() }
}