0

Comme le titre, dispatch_sync() sur la file d'attente principale et thread principal provoquera une impasse, comme ça:Pourquoi dispatch_sync sur le thread principal provoque un interblocage, mais pas NSBlockOperation?

dispatch_sync(dispatch_get_main_queue(), ^{ 
    NSLog(@"%@", [NSThread currentThread]); 
}); 

Mais NSBlockOperation ne causera pas l'impasse:

NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{ 
    NSLog(@"%@", [NSThread currentThread]); 
}]; 
[operation start]; 

Alors, je Je ne comprends pas pourquoi? Cette fonction ne retourne pas tant que le bloc n'a pas fini comme dispatch_sync, alors pourquoi cela ne provoque pas d'interblocage? Et quelle est la différence entre eux?

Répondre

1

Comme vous pouvez le lire here in the official Documentation for NSBlockOperation:

« blocs ajoutés à une opération de bloc sont envoyés en priorité par défaut à une file d'attente de travail appropriés Les blocs eux-mêmes ne devraient pas faire de suppositions sur la configuration de leur environnement d'exécution. ».

Cela signifie spécifiquement que votre bloc ne sera pas exécuté sur le thread principal.

Pour les opérations simultanées (ce qui est vrai pour NSBlockOperation), le procédé start horaires ses travaux de manière asynchrone . Vous devriez avoir vu dans le journal, que votre bloc ne s'exécute pas sur le thread principal. (Remarque: vous devez vous assurer que le thread principal ne se terminera pas avant que le bloc ait été exécuté afin de voir le journal.)