我有以下设置:
swift - 从委托(delegate)的源ViewController调用异步闭包-LMLPHP
Launch VC在闭包中执行异步API请求dataGatheringClosure
闭包的完成处理程序使用protocol methoddataGatheringClosure通过委托将结果传递给VC1。
setData内,VC1使用以下代码将结果传递给VC2:

if let vc2 = self.tabBarController?.viewControllers?[1] as? VC2Controller {
    vc2.data = result
}

我可以将数据从Launch VC传输到VC2,但现在需要通过在Launch VC中执行setData来刷新数据。
我的问题是:如何从VC2访问启动VC的方法?这种方法合理吗?
作为解决方法,我在TabBar VC中复制了dataGatheringClosure闭包代码,并让VC 2调用其dataGatheringClosure方法。但是,它是重复的,而且我也不知道在self.tabBarController.dataGatheringClosure中执行大量API请求是否是最佳实践。

最佳答案

第一步是将数据与ViewControllers分离。创建一个如下所示的单例类,并使用它来传递所需的数据。

class Data {

    static let shared = Data()
    // Declare any other data properties you need here...
    var result = [String]()

    private init() {}

    func initialize() {
        // Write code to initialize the data
        refresh()
    }

    func refresh() {
        // Write code to refresh the data
    }
}

在应用程序启动时或在需要时使用以下代码初始化数据:
Data.shared.initialize()

现在,您可以使用静态变量data.shared从应用程序中的任何位置访问数据。要刷新数据,可以执行以下操作:
Data.shared.refresh()

希望这有帮助。

关于swift - 从委托(delegate)的源ViewController调用异步闭包,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52471865/

10-09 21:51