Les files d'attente d'opérations ne sont pas nécessairement des files d'attente en série. Vous pouvez transformer une file d'attente d'opérations en file d'attente série en appelant [queue setMaxConcurrentOperationCount:1]
sur elle. Sinon, par défaut, NSOperationQueue
sont simultanées.
Vous devez généralement concevoir les opérations que vous soumettez aux files d'attente de manière à ce qu'elles ne nécessitent pas de verrous. C'est votre responsabilité. L'idée est que les opérations doivent être autonomes. Elles doivent être configurées avec les données dont elles ont besoin pour fonctionner avant d'être soumises à l'exécution. Ces données doivent être une copie privée ; l'opération ne doit pas y accéder en même temps que d'autres choses. Pendant l'exécution de l'opération, celle-ci ne doit travailler qu'avec ses données privées et ne doit pas accéder à d'autres parties du programme. Lorsque l'opération est terminée, elle doit mettre ses résultats à la disposition du reste du programme. (Cela peut être passif, en stockant simplement ses résultats dans l'une de ses propres propriétés. Les autres parties du programme qui ont observé l'achèvement de l'opération peuvent alors le lire. Ou cela peut être actif, où la dernière chose que fait l'opération est d'appeler un autre objet et de lui envoyer ses résultats).
NSOperationQueue
ne prend pas en charge le verrouillage en lecture-écriture. Vous pouvez utiliser le pthread_rwlock
API pour cela. Mais une autre solution consiste à utiliser des files d'attente de répartition GCD avec des tâches de barrière. Créez une file d'attente concurrente privée en utilisant dispatch_queue_create()
. Soumettez-lui des tâches de lecture avec dispatch_[a]sync()
. Soumettez-lui des tâches d'écriture en utilisant dispatch_barrier_[a]sync()
.