我为自己构建了一个小应用程序,用于在iPhone上的GUI中保存和显示一些数据。
要查看数据的同步状态,我有一个进度条:
class ViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate {
...
@IBOutlet weak var syncHealthProgress: UIProgressView!
...
}
数据与封装在单独类中的url请求同步,进度条(call-by-reference参数)从中更新:
class ApiService {
...
// function to sync some data, called multiple times from UIViewController
class func syncQlData(progressBar: UIProgressView) -> Void {
...
let task = URLSession.shared.dataTask(with: request as URLRequest) {
data, response, error in
// update progress bar
DispatchQueue.main.async() {
// increment progress bar
progressBar.progress += (1 / Float(ViewController.progressBarSteps))
}
}
}
}
问题:API调用是异步的。但是当同步完成后,我该做什么工作,例如更新GUI中的数据并将同步的数据保存到本地存储。
我尝试在syncHealthProgress
上使用键值观察,但它并没有对.progress
属性产生影响。
当进度条达到100%时,有没有办法在UIViewController
内触发操作?
答案 0 :(得分:2)
使用委托。
在ApiService上面的类实现
protocol ApiServiceDelegate: class {
func updateProgressBar()
}
并在类
中添加一个属性weak var apiServiceDelegate: ApiServiceDelegate!
在你的syncQLData中调用updateProgressBar(),如
let task = URLSession.shared.dataTask(with: request as URLRequest) {
data, response, error in
// update progress bar
self. apiServiceDelegate.updateProgressBar()
}
在ViewController中(进度条所在的位置)添加协议,如
class ViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate, ApiServiceDelegate
在实例化ApiService时,您必须设置委托。
我认为你做的事情就像
let apiService = ApiService()
apiService.syncQlData(syncHealthProgress)
您必须将其更改为
let apiService = ApiService()
apiService.apiServiceDelegate = self
apiService.syncQlData(syncHealthProgress)
现在您可以在ViewController中实现委托的功能,如
func updateProgressBar() {
syncHealthProgress.progress += (1 / Float(progressBarSteps))
}