我有以下设置:
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/