2015-01-04 13 views
10

È possibile eseguire un passaggio dal thread principale?È possibile eseguire un passaggio dal thread principale?

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

Oppure qual è il modo corretto per farlo?

risposta

13

Generalmente, tutte le operazioni Cocoa e Cocoa Touch devono essere eseguite sul thread principale. In caso contrario, potrebbero verificarsi problemi come l'UI che non si aggiorna correttamente e talvolta si blocca anche. Così si dovrebbe avvolgere la chiamata a performSegueWithIdentifier:

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

In UIKit (Cocoa Touch), chiamando roba interfaccia utente su un thread in background è stato un modo sicuro per mandare in crash nei tempi antichi. Dal momento che iOS 4 (IIRC) molte cose sono ora "thread-safe" nel senso che l'app non si blocca più ma alcune operazioni semplicemente vengono ignorate quando eseguite in un thread in background. Quindi è sempre una buona idea eseguire il codice che mette in disordine gli oggetti dell'interfaccia utente sul thread principale.

Non sono sicuro della sicurezza del thread di AppKit (Cocoa). So che chiamare elementi AppKit su thread in background potrebbe causare il blocco della tua app, ma non so se sia più vero. Meglio essere sicuri che dispiaciuti e chiamare anche gli oggetti dell'interfaccia utente sul thread principale.

Problemi correlati