触发进度条100%

时间:2017-12-08 13:59:14

标签: swift uikit

我为自己构建了一个小应用程序,用于在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内触发操作?

1 个答案:

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