UI更改swift,CoreAnimation:警告,已删除的线程与未提交的CATransaction

时间:2017-01-14 17:12:51

标签: swift multithreading macos macos-sierra

我相对较新,并且想知道是否有人可以帮助解决这个问题。

我正在尝试在服务调用期间将按钮上的标签更改为加载微调器,然后在不久之后更改为该调用的响应消息。

我在日志中收到此错误:

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

1 个答案:

答案 0 :(得分:1)

所以,在你移出主线程之前,你正在调用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() } 。这是不必要的。此外,一旦您在后台线程上工作,您将更新一些UI(您的按钮标题)而不会调度回主线程。永远不要在后台线程上更新UI。

{{1}}