为什么不在屏幕上反映label.text更新?

时间:2016-02-19 05:26:04

标签: ios swift uiviewcontroller nsoperationqueue

我有一个简单的测试应用程序,它将一些作业提交给NSOperationQueue,然后等待它们完成。然后我有一个例程来检查队列中的作业数量,并且应该更新屏幕上的值。同时它将值打印到控制台。控制台完全按照我的预期运行,每十秒打印一个数字。该数字减少到零并触发警报。但在任何阶段,标签(进展)都不会从" Hello"。

改变

我有一种感觉,而不是我的代码中的错误,这是我对Swift的理解中的一个漏洞。请帮忙。

我的代码:

main

2 个答案:

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