我有一个可以处理网络请求的类。在init()
上,我加载了一些初始数据。因此,该类如下所示:
class NetworkHandler {
init() {
loadData()
}
func loadData() {
// Do an asynchronous function to load initial data
}
}
我将此类的对象传递给ViewController。在此ViewController中,我想显示一个加载指示器,直到完成初始加载为止。接下来,我想显示一个正常的屏幕。像这样:
class viewController: UIViewController {
var networkHandler: NetworkHandler?
override func viewDidLoad() {
super.viewDidLoad()
if networkHandler.initialLoadIsDone {
// Show something
} else {
// Show a loading indicator
// Listen on networkHandlers initial load
// On initial load done: Show somethin
}
}
}
所以第一步是,如果初始加载完成,我可以使用networkHandler中的局部变量进行处理。但是由于我不调用初始加载函数,因此无法使用completionHandler来等待初始加载完成。所以我想知道等待初始负载完成的最佳方法是什么?另外,我可以用这个替换局部变量解决方案吗?
感谢您的帮助
答案 0 :(得分:2)
别等。通知。
例如,使用协议/委托向目标类告知阶段
protocol NetworkHandlerProtocol {
func didStartLoading()
func didFinishInitialLoading(with data: Data)
}
class NetworkHandler {
var delegate : NetworkHandlerProtocol
init(delegate : NetworkHandlerProtocol) {
self.delegate = delegate
}
func loadData() {
delegate.didStartLoading()
// Do an asynchronous function to load initial data
let data = // some Data object
delegate.didFinishInitialLoading(with: data)
}
}
在控制器中采用协议并实现方法
class ViewController: UIViewController {
lazy var networkHandler = NetworkHandler(delegate : self)
override func viewDidLoad() {
super.viewDidLoad()
networkHandler.loadData()
}
}
extension ViewController : NetworkHandlerProtocol {
func didStartLoading() { }
func didFinishInitialLoading(with data: Data) { }
}