我需要实现一个考虑到几个因素的进度条。
我有三个不同的类,我的ViewController,一个处理网络调用的Networking类和一个处理所有db操作的dataManager类。
现在,我的progressView位于viewcontroller中,我正在寻找一种在其他类中执行每个不同操作时更新它的方法。
我正在使用Alamofire,因此我知道可以使用.progress{}来捕获JSON进度的值,但这也意味着将ViewController公开给Networking类,我认为这是一种不好的做法?
我认为这应该通过使用完成处理程序来实现,但是由于我已经为处理JSON/DB操作设置了另一个线程,所以我不想再把它复杂化了
网络:
func makeGetRequest(url : String, params : [String : String]?, completionHandler: (responseObject: JSON?, error: NSError?) -> ()) -> Request? {
return Alamofire.request(.GET, url, parameters: params, encoding: .URL)
.progress { _, _, _ in
//bad practice?
progressView.setProgress(request.progress.fractionCompleted, animated: true)
}
.responseJSON { request, response, data, error in completionHandler(
responseObject:
{
let json = JSON(data!)
if let anError = error
{
println(error)
}
else if let data: AnyObject = data
{
let json = JSON(data)
}
return json
}(),
error: error
)
}
}
视图控制器:
dataManager.loadData({(finished: Bool, error:NSError?) -> Void in
if let errorMessage = error{
self.syncProgress.setProgress(0, animated: true)
let alertController = UIAlertController(title: "Network Error", message:
errorMessage.localizedDescription, preferredStyle: UIAlertControllerStyle.Alert)
alertController.addAction(UIAlertAction(title: "Dismiss", style: UIAlertActionStyle.Default,handler: nil))
self.presentViewController(alertController, animated: true, completion: nil)
}
if finished{
for i in 0..<100 {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), {
sleep(1)
dispatch_async(dispatch_get_main_queue(), {
self.counter++
return
})
})
}
}
})
如您所见,在更新进度条之前,我正在等待在datamanger类中设置完成的布尔值。问题是,dataManager会调用networking并在它完成之前执行一系列其他操作,在这一过程中更新进度条会很方便,但我不确定最好的方法是什么?
数据管理器:
func loadData(completion: (finished: Bool, error: NSError?) -> Void) {
var jsonError: NSError?
networking.makeGetRequest(jobsUrl, params: nil) { json, networkError in
//....
}
最佳答案
我不太熟悉swift,所以我不能给你一个代码示例,但是我要做的是在你的Networking类上创建一个协议,并在ViewController中实现这个协议。协议方法类似于(在objective-c中)NetworkingDelegate
假设ViewController调用Networking.makeGetRequest。如果是另一个类,则可以在该类中实现委托,也可以通过DataManager类冒泡地调用ViewController的委托。
关于ios - 快速进度 View 值传递给函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31923642/