如何等待已经运行的功能完成

时间:2019-10-09 11:17:11

标签: ios swift

我有一个可以处理网络请求的类。在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来等待初始加载完成。所以我想知道等待初始负载完成的最佳方法是什么?另外,我可以用这个替换局部变量解决方案吗?

感谢您的帮助

1 个答案:

答案 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) { }

}