iPhone: адресная книга иногда стирается - PullRequest
6 голосов
/ 18 января 2011

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

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

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

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

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

-
Майкл

1 Ответ

4 голосов
/ 13 января 2012

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

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

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

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

...