从主线程执行segue是否可以?
user.saveInBackgroundWithBlock { (success: Bool!, error: NSError!) -> Void in
if success == false || error != nil {
println(error)
} else {
self.performSegueWithIdentifier("jumpToMessagesViewController", sender: self)
}
}
或者这样做的正确方法是什么?
答案 0 :(得分:17)
通常,所有 Cocoa和Cocoa Touch操作都应该在主线程上完成。如果您不这样做,您可能会遇到UI无法正确更新等问题,有时甚至会崩溃。所以你应该把你的电话打包到performSegueWithIdentifier
:
DispatchQueue.main.async {
self.performSegue(withIdentifier: "jumpToMessagesViewController", sender: self)
}
在UIKit(Cocoa Touch)中,在后台线程上调用UI东西是过去崩溃的可靠方法。从iOS 4(IIRC)开始,现在很多东西都是线程安全的#34;从某种意义上说,应用程序不会再崩溃,但在后台线程中执行时,某些操作会被忽略。因此,执行与主线程上的UI对象混淆的代码总是一个好主意。
我不确定AppKit(Cocoa)的线程安全性。我知道在后台线程上调用AppKit的东西可能会使你的应用程序崩溃,但我不知道这是否真的存在。最好是安全而不是抱歉,并在主线程上调用您的UI对象。