我有一个简单的测试应用程序,它将一些作业提交给NSOperationQueue,然后等待它们完成。然后我有一个例程来检查队列中的作业数量,并且应该更新屏幕上的值。同时它将值打印到控制台。控制台完全按照我的预期运行,每十秒打印一个数字。该数字减少到零并触发警报。但在任何阶段,标签(进展)都不会从" Hello"。
改变我有一种感觉,而不是我的代码中的错误,这是我对Swift的理解中的一个漏洞。请帮忙。
我的代码:
main
答案 0 :(得分:1)
UI直到showProgress方法结束才会更新。所以你可以做下面的事情,如果这是你所追求的,。
作为另一个线程调用,
NSThread.detachNewThreadSelector("showProgress", toTarget: self, withObject: nil)
然后更新主线程上的UI
func showProgress() {
while Int(session.operationQueue.operationCount) > 0 {
sleep(10)
print(session.operationQueue.operationCount)
dispatch_async(dispatch_get_main_queue(), { () -> Void in
progress.text = String(session.operationQueue.operationCount)
})
}
dispatch_async(dispatch_get_main_queue(), { () -> Void in
let confirmUpload = UIAlertController(title: "Your Tasks have been performed.”, message: “Congratulation!”, preferredStyle: UIAlertControllerStyle.Alert)
confirmUpload.addAction(UIAlertAction(title: "Ok", style: .Default, handler: { (action: UIAlertAction!) in self.navigationController?.popViewControllerAnimated(true)}))
presentViewController(confirmUpload, animated: true, completion: nil)
})
}
在主线程中运行都不会解决您的问题,即使您进行异步调度
答案 1 :(得分:0)
sleep()
不允许UI线程自行更新,因此您必须在异步块中更新它: -
while Int(session.operationQueue.operationCount) > 0 {
sleep(10)
print(session.operationQueue.operationCount)
///add this line
dispatch_async(dispatch_get_main_queue()) {
progress.text = String(session.operationQueue.operationCount)
}
}