2017-01-26 2 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 = ложный вызов, ни обновление 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

Ваш обработчик завершения будет запускать все в фоновом потоке, и вам нужно сделать вызовы пользовательского интерфейса в основном потоке.

Оберните ваши штриховые вызовы прогресса в отправке в основную очередь, как этот

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

Спасибо. Если вы нашли вопрос актуальным, пожалуйста, подтвердите его. –

1

Попробуйте поставить свой код пользовательского интерфейса в блоке DispatchQueue.main.async. Операции пользовательского интерфейса. Отключение основной нити представляет собой задержки.

Смежные вопросы