2017-01-14 9 views
0

Я относительно новый, чтобы быстро и интересно, сможет ли кто-нибудь помочь с этой проблемой.UI Изменения в быстром, CoreAnimation: предупреждение, удаленная нить с незафиксированным CATransaction

Я пытаюсь сделать ярлык при смене кнопки на загрузочный счетчик во время вызова службы, а затем сразу же перейти к ответному сообщению этого звонка.

Я получаю эту ошибку в моем журнале:

CoreAnimation: warning, deleted thread with uncommitted CATransaction; set CA_DEBUG_TRANSACTIONS=1 in environment to log backtraces.

Спасибо за помощь. Я читал об этих основных ошибках анимации, но я не уверен, что я делаю неправильно, поскольку все здесь делается асинхронно.

Вот исправленный код, благодаря @Pierce:

 self.pastebinButton.isEnabled = false 
     self.pastebinButton.title = "" 
     self.pastebinProgressIndicator.startAnimation(nil) 

     pastebinAPI.postPasteRequest(urlEscapedContent: urlEscapeText(txt: text)) { pasteResponse in 

      DispatchQueue.main.async { 
       self.pastebinProgressIndicator.stopAnimation(nil) 
       if pasteResponse.isEmpty { 
        self.pastebinButton.title = "Error" 
       } else { 
        self.pastebinButton.title = "Copied!" 
       } 
      } 

      DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(2), execute: { 
       self.pastebinButton.title = "Pastebin" 
       self.pastebinButton.isEnabled = true 
      }) 
+0

Является ли 'pastebinProgressIndicator'' UIProgressView'? – Pierce

+0

Спасибо за ответ. Это 'NSProgressIndicator' –

+0

Я разрабатываю для Mac OS –

ответ

1

Так вы звоните в DispatchQueue.main.async, прежде чем вы даже перемещены за пределы основного потока. Это не нужно. Также, как только вы работаете над фоновым потоком, вы обновляете некоторый пользовательский интерфейс (название вашей кнопки), не отправляя обратно в основной поток. Никогда не обновляйте пользовательский интерфейс в фоновом потоке.

if !text.trimmingCharacters(in: NSCharacterSet.whitespacesAndNewlines).isEmpty { 

    self.pastebinButton.title = "" 
    self.pastebinProgressIndicator.startAnimation(nil) 

    pastebinAPI.postPasteRequest(urlEscapedContent: urlEscapeText(txt: text)) { pasteResponse in 

     // Clean up your DispatchQueue blocks 
     DispatchQueue.main.async { 
      self.pastebinProgressIndicator.stopAnimation(nil) 
      if pasteResponse.isEmpty { 
       self.pastebinButton.title = "Error" 
      } else { 
       self.pastebinButton.title = "Copied!" 
      } 
     } 

     DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(2), execute: { 
      self.pastebinButton.title = "Pastebin" 
      self.pastebinButton.isEnabled = true 
     }) 

    } 
} else { 
    Utility.playFunkSound() 
}