2011-08-09 1 views
2

Dans le document de pomme, pomme dit:peut-elle fonctionner cadre ABAddressBook avec (problème de fil) Queue série Grand Central Dispatch

Important: Les instances de ABAddressBookRef ne peuvent pas être utilisés par plusieurs threads. Chaque thread doit créer sa propre instance.

Et

objets de fichiers ne peuvent être passés à travers les discussions safely.Instead, vous doit passer l'identifiant d'enregistrement correspondant

Qu'est-ce que le premier veut dire? Si je peux assurer à chaque instant, il n'y a qu'un seul thread qui accède à ABAddressBookRef, puis-je utiliser ABAddressBookRef dans plusieurs threads?

Et le second, qu'est-ce qui ne peut pas être passé en toute sécurité sur les threads?

Et il semble que GCD n'assure pas que tous les blocs sont excutés dans le même fil même si les blocs sont dans une même file d'attente série.

Est-ce que cela signifie que je ne peux pas utiliser GCD pour gérer le framework ABAddressBook? Ou je peux seulement créer un ABAddressBookRef dans chaque bloc? (J'ai testé cela, vraiment lent)

Répondre

2

This question couvre le même problème. Ce n'est pas que ABAddressBook n'est pas thread-safe, cela signifie que vous ne pouvez pas utiliser du tout le multithread.

Cependant, vous pouvez écrire une classe wrapper avec des méthodes getter/setter pour faire ce dont vous avez besoin, qui pourrait être appelée à partir de threads arbitraires dans un bloc dispatch. Toutes les fonctions 'mutantes' à l'intérieur de l'enveloppe devront cependant se produire sur le même fil. Peut-être envisager de regarder la documentation dispatch_once pour utiliser grand-central pour se protéger contre l'instanciation multiple.

Questions connexes