Можно ли выполнить отступ от основного потока?

Можно ли выполнить отступ от основного потока?

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

Или как правильно это сделать?

Ответ 1

Как правило, все операции Cocoa и Cocoa Touch должны выполняться в основном потоке. Если вы этого не сделаете, у вас могут возникнуть проблемы, такие как пользовательский интерфейс, который не обновляется должным образом, а иногда даже падает. Поэтому вы должны перевести свой вызов на performSegueWithIdentifier:

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

В UIKit (Cocoa Touch) вызов материала пользовательского интерфейса в фоновом потоке был верным способом свернуть в старые времена. Начиная с iOS 4 (IIRC), многие вещи теперь "потокобезопасны" в том смысле, что приложение больше не падает, но некоторые операции просто игнорируются при выполнении в фоновом потоке. Поэтому всегда нужно выполнять свой код, который помешает с объектами пользовательского интерфейса в основном потоке.

Я не уверен в безопасности потоков AppKit (Cocoa). Я знаю, что вызов приложения AppKit в фоновом потоке может привести к краху вашего приложения, но я не знаю, действительно ли это правда. Лучше быть в безопасности, чем сожалеть, и также называть свои объекты пользовательского интерфейса в основном потоке.