Tout travail lié à l'interface utilisateur doit être exécuté sur le thread principal pour iOS. Parfois, nous devons faire des emplois async comme le téléchargement d'une image et nous utiliserions probablement dispatch_async et quand le téléchargement terminé nous obtenons le thread principal et l'afficher comme quelque chose comme ceci:Les méthodes uikit sont-elles garanties sur le thread principal?
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
UIImage *overlayImage = [self faceOverlayImageFromImage:_image];
dispatch_async(dispatch_get_main_queue(), ^{
[self fadeInNewImage:overlayImage];
});
});}
Mais quand on charge une image que nous faisons habituellement juste localement cela sans l'envoi sur fil conducteur:
UIImageView *imageView = [[UIImageView alloc] initWithImage:@"myimage.png"];
Ma question est qu'ils sont garantis pour être exécuté sur thread principal? Si oui, pourquoi devrions-nous l'envoyer en utilisant dispatch_get_main_queue()? Si non, pourquoi n'avons-nous pas besoin d'envoyer tous les travaux liés à ui sur le thread principal?
Pour clarifier: le plus souvent, la raison pour laquelle vous devez utiliser dispatch est que * vous * avez démarré un thread d'arrière-plan, et que ce thread doit modifier l'interface utilisateur. À moins que la modification de l'interface utilisateur ne soit effectuée via un rappel qui gère le basculement vers le thread d'interface utilisateur pour vous (par exemple, setProgress d'une barre de progression), vous devez utiliser dispatch. – ToolmakerSteve