2017-01-26 54 views
1

我有一個NSProgressIndicator(進度條),這似乎完全在工作時的委託方法像這樣的裏面:NSProgressIndicator沒有內部功能的工作與回調

func restClient(client: DBRestClient!, uploadProgress progress: CGFloat, forFile destPath: String!, from srcPath: String!) { 
     if progress == 1.0 { 
      progressBar.hidden = true 
      generalAlert("Uploaded", text: "Your File has been saved to your computer and uploaded under: \(destPath)") 
     } else { 
      progressBar.hidden = false 
      print(progress) // e.g 0.010213 
      progressBar.doubleValue = Double(progress)*100 
     } 
    } 

但是,擺在函數內部有一個回調的時候,我似乎無法以任何方式修改它(既不接受我的isHidden = false調用,也不接受doubleValue更新)。

CloudConvert.convert([ 
      "inputformat": "gif", 
      "outputformat" : "mov", 
      "input" : "upload", 
      "file": name], 

      progressHandler: { (step, percent, message) -> Void in 
       print(percentage!) //e.g 10.31451. Called every second 
       self.progressBar.hidden = false //Doesn't Work 
       self.progressBar.doubleValue = Double(percentage!) //Doesn't Work 
      }, 
      completionHandler: { (path, error) -> Void in 
       if(error != nil) { 
        self.progressBar.hidden = true 
        self.generalAlert("ERROR", text: "Your file could not be uploaded") 
       } else { 
        self.progressBar.hidden = true 
        self.generalAlert("MOV Uploaded", text: "Your MOV has been saved to your computer and uploaded") 
       } 
     }) 

任何人都可以提供一個爲什麼這可能是一個想法?

+0

你確定回調是在主線程上嗎? –

+0

我不是!這就是答案!你會把它作爲答案,而不是評論,以便我可以接受它嗎? –

回答

1

您的完成處理程序將在後臺線程中運行所有內容,並且您需要在主線程上進行UI調用。

總結你的進度條通話,派遣到主隊列這樣

DispatchQueue.main.async(execute: { 
     self.progressBar.hidden = false //Should now Work 
     self.progressBar.doubleValue = Double(percentage!) //Should now Work 
    }) 
+0

謝謝。如果您發現問題是相關的,請將其加入。 –

1

儘量把你的UI代碼在DispatchQueue.main.async塊。 UI操作關閉主線程會導致延遲。