iPhone: адресная книга иногда стирается

Я использую ABAddressBook в своем приложении.
Доступ к AB осуществляется из отдельного потока, чтобы освободить пользовательский интерфейс.
Мне известно, что доступ к экземпляру AB должен осуществляться из того же поток все время, и по этой причине я создал оболочку.
Оболочка является одноэлементной и поддерживает свой собственный фоновый поток.
Все сообщения, поступающие в оболочку, автоматически перенаправляются в фоновый поток, в то время как вызывающий поток ждет окончания реализации и в конце заполняет аргумент out соответствующими данными (список контактов, конкретный контакт и т. д.).

Хотя адресная книга на устройстве иногда опустошается (стирается).
После каждого 10-20-го использования приложения.

Итак, у меня есть несколько вопросов:

  • После того, как я получу ABRecordRef от AB в выделенном потоке, должен ли я извлекать данные из ABRecordRef также в том же потоке или это может быть другой поток? У меня также есть обертка для ABRecordRef, поэтому, когда я извлекаю контакт из AB, я заполняю объект-оболочку человека, а затем использую его (читай из ABRecordRef) из исходного потока.
  • Когда я использую API-интерфейсы пользовательского интерфейса AB (контроллер навигации средства выбора человека, контроллер представления нового человека и т. д.) и передаю им свой экземпляр ABAddressBook, должен ли я беспокоиться о том, что API не будет использовать этот экземпляр AB из того же потока, что и создал его? Я видел, что могу передать NULL вместо экземпляра AB, и тогда API будет использовать свой собственный AB, но что мне делать, если я хочу изменить контакт? В этом случае я должен передать экземпляр ABRecordRef...
  • Есть что-то еще, о чем я не подумал?

Заранее спасибо.

--
Михаил


person Michael Kessler    schedule 18.01.2011    source источник


Ответы (1)


Вы должны обращаться к адресной книге только из того же потока, который вызвал ABAddressBookCreate(). Вы не можете использовать ABRecordRef в другом потоке. Только идентификаторы записей и скопированные данные можно безопасно передавать между потоками.

Обычно я создаю последовательную очередь отправки и использую ее в качестве оболочки для вызовов адресной книги, которые не могут блокировать основной поток.

Когда вы используете пользовательский интерфейс, вам нужно вызвать ABAddressBookCreate() в основном потоке и использовать его для вызовов пользовательского интерфейса.

Если вам нужно изменить контакт с помощью пользовательского интерфейса, вы должны изменить контакт, сохранить его, а затем обновить адресную книгу в фоновом потоке или очереди, чтобы она содержала последние изменения. Для этой цели существует обратный вызов уведомления ABAddressBookRegisterExternalChangeCallback.

person Eric    schedule 12.01.2012