2015-01-04 9 views
10

メインスレッドからセグを実行しても問題ありませんか?メインスレッドからセグを実行してもよろしいですか?

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

またはこれを行う正しい方法は何ですか。

答えて

13

通常、すべてメインスレッドでココアタッチ操作を実行する必要があります。あなたがUIを正しく更新しないなどの問題が発生したり、時にはクラッシュすることさえあります。だから、performSegueWithIdentifierにあなたの呼び出しをラップする必要があります。

のUIKit(ココアタッチ)で
DispatchQueue.main.async { 
    self.performSegue(withIdentifier: "jumpToMessagesViewController", sender: self) 
} 

、バックグラウンドスレッドでUIのものを呼び出す昔にクラッシュする確実な方法でした。 iOS 4(IIRC)以来、アプリがもうクラッシュしないという意味で、スレッドセーフであることが多くありますが、バックグラウンドスレッドで実行されると一部の操作が無視されるという意味です。したがって、メインスレッドのUIオブジェクトを混乱させるコードを実行することは、常に良い考えです。

AppKit(Cocoa)のスレッドセーフについてはわかりません。バックグラウンドスレッドでAppKitを呼び出すとアプリがクラッシュする可能性があることは知っていますが、それが本当かどうかは分かりません。申し訳ありませんが、メインスレッド上でUIオブジェクトを呼び出すよりも安全です。