在 Swift 中 initi() 完成后立即运行函数

问题描述 投票:0回答:1

我正在测试从初始值设定项运行委托模式。这是我的数据供应商测试类及其数据源:

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 并运行函数并发送数据。当然,这没有用。我期望在控制台中看到打印的内容:

  1. 我的班级已初始化
  2. MyClass代表集
  3. getString() 函数运行
  4. DataSource 在 OtherClass 中运行并打印字符串:Hello World

但是 getString() 会在设置或创建 OtherClass 之前立即运行并打印以下内容:

  1. 我的班级已初始化
  2. getString() 函数运行
  3. MyClass代表集

如果我手动延迟 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)
        }
    }

所以,我的问题是,我怎样才能让它发挥作用?我可以通过初始化类来设置委托并在它们之间发送数据吗?有可能以某种方式做到吗?

ios swift delegates datasource init
1个回答
0
投票

无法在

getString
中呼叫
init
。您希望在调用
getString
之前设置数据源,但是
getString
是在
init
中调用的,因此其他代码没有机会设置数据源。其他代码只能在
init
之后设置数据源。

要实现此事件序列,您可以在设置

getString
后立即调用
dataSource
。这是您可以有意义地调用
getString
的最早时间点 - 在此之前的任何时间都不会调用
returnString

weak var dataSource: MyClassDataSource? {
    didSet { getString() }
}
© www.soinside.com 2019 - 2024. All rights reserved.