首页 > 解决方案 > 如何等待已在运行的函数完成

问题描述

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

谢谢你的帮助

标签: iosswift

解决方案


不要等待。做通知。

例如使用协议/委托通知目标类有关阶段

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

}

推荐阅读