问题 从主线程执行segue是否可以?


从主线程执行segue是否可以?

user.saveInBackgroundWithBlock { (success: Bool!, error: NSError!) -> Void in
 if success == false || error != nil {
  println(error)
 } else {
  self.performSegueWithIdentifier("jumpToMessagesViewController", sender: self)
 }
}

或者这样做的正确方法是什么?


8424
2018-01-04 13:30


起源



答案:


通常, 所有 Cocoa和Cocoa Touch操作应该在主线程上完成。如果不这样做,您可能会遇到UI无法正确更新等问题,有时甚至会崩溃。所以你应该把你的电话包起来 performSegueWithIdentifier

DispatchQueue.main.async {
  self.performSegue(withIdentifier: "jumpToMessagesViewController", sender: self)
}

在UIKit(Cocoa Touch)中,在后台线程上调用UI东西是在过去的日子里崩溃的可靠方法。从iOS 4(IIRC)开始,很多东西现在都是“线程安全的”,因为应用程序不再崩溃,但在后台线程中执行时,某些操作会被忽略。因此,执行与主线程上的UI对象混淆的代码总是一个好主意。

我不确定AppKit(Cocoa)的线程安全性。我知道在后台线程上调用AppKit的东西可能会使你的应用程序崩溃,但我不知道这是否真的。最好是安全而不是抱歉,并在主线程上调用您的UI对象。


14
2018-01-04 13:37