ios - 如何等待已在运行的函数完成
问题描述
我有一堂课会做一些网络请求。在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 来等待初始加载完成。所以我想知道等待初始加载完成的最佳方法是什么?另外,我可以用这个替换局部变量解决方案吗?
谢谢你的帮助
解决方案
不要等待。做通知。
例如使用协议/委托通知目标类有关阶段
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) { }
}
推荐阅读
- c# - 使用 Graphics.DrawLine() 画圆
- sql - 使用 ORACLE 中的 CASE 语句了解 UPDATE 评估所有行
- javascript - 如何使用指向相关页面的 URL 获取类或 id 的内容
- java - 有没有办法让一个 for 循环为不同的用户输入返回不同的值?
- javascript - 从jQuery调用表单提交()时的无限循环
- elasticsearch - 如何为数字和文本搜索索引字段
- redis - 运行 redis-server 作为 PyCharm 配置
- android - 有什么理由再在 Android 上使用外部存储?
- c++ - 为什么并行 std::for_each 返回 void
- java - 如何使用 Maven 设置 LWJGL?