J'utilise généralement le code suivant pour mettre à jour le changement de l'interface utilisateur ou affiche une boîte de dialogue:Où dois-je utiliser dispatch_async sur main_queue?
dispatch_async(dispatch_get_main_queue())
{
...
}
Je suis clair pour l'utiliser dans le scénario suivant:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//Add some method process in global queue - normal for data processing
dispatch_async(dispatch_get_main_queue(), ^(){
//Add method, task you want perform on mainQueue
//Control UIView, IBOutlet all here
});
//Add some method process in global queue - normal for data processing
});
Cependant, diriez-vous de l'autre cas, par exemple, dans certaines fermetures ou fonctions de rappel? Fonction
autocomplete(sbYouTube.text!) { (results, status) -> Void in
if status == "OK"
{
if let results = results
{
addAutocompletes(results)
}
dispatch_async(dispatch_get_main_queue())
{
self.tvAutocomplete.reloadData()
}
}
else
{
NSLog("%@", status)
}
}
ou
func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64)
{
dispatch_async(dispatch_get_main_queue())
{
self.downloadedSize = totalBytesWritten
self.sizeToDownload = totalBytesExpectedToWrite
self.downloadProcess.angle = Double(totalBytesWritten) * 360.0/Double(totalBytesExpectedToWrite)
self.lbPercent.text = "\(totalBytesWritten * 100/totalBytesExpectedToWrite)%"
}
}
Quelle est votre question ici? –
Vous devriez toujours dispatch_async dans la file d'attente principale si vous mettez à jour l'interface utilisateur. Par exemple, votre dernier extrait définit self.lbPercent.text, que nous pouvons supposer être un UILabel. Donc, cela doit être fait sur le fil principal. Vous êtes libre d'ignorer cela si vous êtes sûr que vous êtes déjà sur le fil principal. – ncke