манипулирование многопоточной адресной книгой на iPhone - PullRequest
9 голосов
/ 04 марта 2010

Я уже давно использую API адресной книги iPhone. Но, проведя некоторый рефакторинг для повышения производительности приложений, я решил «повторно использовать» ABAddressBookRef, возвращенный AddressBookCreate, потому что я заметил, что это значительно улучшило производительность. Тем не менее, я получаю ошибки EXEC_BAD_ACCESS теперь случайно, и я думаю, что причина в этом "предостережении" в эталонной реализации iPhone: http://developer.apple.com/iphone/library/documentation/ContactData/Conceptual/AddressBookProgrammingGuideforiPhone/300-BasicObjects/BasicObjects.html#//apple_ref/doc/uid/TP40007744-CH3-SW1

Важно: Экземпляры ABAddressBookRef не могут использоваться несколькими потоками. Каждый поток должен создать свой собственный экземпляр, вызывая ABAddressBookCreate.

Теперь я подумал, что это просто означает, что он не является поточно-ориентированным, поэтому мне пришлось синхронизировать доступ к API, но, возможно, я ошибаюсь, и есть ли другие причины, по которым несколько потоков портят структуру данных?

Может ли кто-нибудь подтвердить, действительно ли это потокобезопасная проблема (поэтому @synchronize должен работать) или какая-то другая проблема?

Приветствия

1 Ответ

11 голосов
/ 05 марта 2010

Это не проблема безопасности потока ... нет способа решить ее с помощью блокировок. Комментарий проясняет это:

Важно : Экземпляры ABAddressBookRef не могут использоваться несколько потоков. Каждый поток должен сделать свой собственный экземпляр, позвонив ABAddressBookCreate.

Что вы можете сделать, это создать отдельный экземпляр ABAddressBook и создать архитектуру производителя / потребителя, которая будет управлять доступом к объекту.

Оболочка будет иметь основной поток, который выполняет только одно: читает запросы операций из очереди блокировки, а затем выполняет операции с адресной книгой. Все ваши потоки будут помещать свои операции в одну очередь, и оболочка выполнит эти действия; если в очереди ничего нет, то оболочка будет блокироваться, пока в ней что-то не окажется.

Это должно решить проблему недопущения использования ABAddressBookRef из нескольких потоков.

...