iPhone многопоточное управление AddressBook

Я использовал AddressBook 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 должен работать), или некоторая другая проблема?

Аплодисменты

9
задан Marco 4 March 2010 в 20:10
поделиться

1 ответ

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

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

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

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

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

11
ответ дан 4 December 2019 в 20:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: