2016-12-15 1 views
0

Je pense comprendre le fonctionnement de ce qui suit, mais j'apprécierais la confirmation.IOS/Objective-C: retour au fil principal

dispatch_async(kBgQueue, ^{ 
    NSData* data = [NSData dataWithContentsOfURL: dataUrl]; 
    [self fetchData:data];//go to web, get data and store in core data 
} 
dispatch_async(dispatch_get_main_queue(), ^{ 
    //display new data on main thread. 
} 

Ma question est ce que je peux prendre pour acquis que l'affichage sur le thread principal ne pourra avoir lieu qu'après la conclusion de tout ce qui se produit en arrière-plan - peu importe combien de temps?

La raison pour laquelle j'apprécierais la confirmation est que parfois j'observe quelques problèmes avec l'affichage. Vous voulez être sûr que l'affichage n'essaie pas d'accéder aux données de base lorsque le thread d'arrière-plan n'a pas fini d'enregistrer.

+0

c'est correct. mais que voulez-vous dire par "l'affichage n'est pas ...."? Comment "l'affichage" peut-il faire quoi que ce soit –

+0

L'appel à '[NSData dataWithContentsOfURL]' pourrait faire une requête réseau depuis le web, en fonction de l'endroit où Si c'est une URL de fichier pointant vers un fichier sur le système de fichiers local, il récupèrera simplement les données du fichier local Si c'est une URL distante comme 'http: // foo/bar.jpg' Récupérer les données depuis un serveur distant de façon SYNCHRONISÉE –

Répondre

2

Votre code est incorrect. Vous essayez de mettre à jour l'interface utilisateur bien avant que les données soient extraites de l'URL.

Vous devez:

dispatch_async(kBgQueue, ^{ 
    NSData* data = [NSData dataWithContentsOfURL: dataUrl]; 
    [self fetchData:data];//go to web, get data and store in core data 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     //display new data on main thread. 
    } 
} 

Ce code suppose également que fetchData: n'est pas sens asynchrone qu'il ne retourne pas jusqu'à ce que les données ont été récupérées et mises à jour.

+0

Donc, si je place l'envoi dans la file d'attente principale à l'intérieur de dispatch_asynch, il attendra que les données soient récupérées? – Arjun

+0

Oui, ce n'est pas différent d'un autre appel de méthode. cela ne fonctionne que si l'implémentation de 'fetchData: 'ne retourne pas tant que les données n'ont pas été récupérées et stockées dans les données de base.Si son implémentation est asynchrone, alors' fetchData:' retournera trop tôt.La solution sera alors d'ajouter gestionnaire d'achèvement à 'fetchData'. – rmaddy

+0

Je sens que vous ne comprenez pas comment fonctionnent les appels de fonctions asynchrones. Une fonction asynchrone retourne immédiatement, avant que la tâche soit terminée. –