2016-08-20 1 views
0

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)%" 
    } 
} 
+3

Quelle est votre question ici? –

+0

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

Répondre

0
  1. dispatch_get_main_queue() retournera la file d'attente principale où votre interface utilisateur est en cours d'exécution. La fonction dispatch_get_main_queue() est très utile pour mettre à jour l'interface utilisateur de l'application iOS car les méthodes UIKit ne sont pas thread-safe (à quelques exceptions près) donc tous les appels que vous faites pour mettre à jour les éléments UI doivent toujours être faits.

pour plus voir ce lien

https://www.hackingwithswift.com/read/9/4/back-to-the-main-thread-dispatch_get_main_queue

0

Vous êtes sûr à utiliser ce bloc:

dispatch_async(dispatch_get_main_queue(), ^(){ 
    //Add method, task you want perform on mainQueue 
    //Control UIView, IBOutlet all here 

    }); 

partout, dans les fermetures et les fonctions de rappel. Il s'assure que le code qu'il contient est exécuté sur le thread principal. Vous pouvez également utiliser NSOperationQueue.mainQueue.performBlock comme il fait la même chose