iPhone:地址簿有时会被删除

Mic*_*ler 6 multithreading abaddressbook ios abrecordref

ABAddressBook在我的应用程序中使用.
对AB的访问来自单独的线程以释放UI.
我知道对AB实例的访问必须始终来自同一个线程,因此我构建了一个包装器.
包装器是一个单例,它维护自己的后台线程.
到包装器的所有消息都会自动重定向到后台线程,而调用线程会一直等到实现结束,最后用相关数据(联系人列表,特定联系人等)填充out参数.

尽管如此,设备上的地址簿有时会被清空(擦除).
每10-20次使用该应用程序后.

所以,我几乎没有问题:

  • 在专用线程中从AB获取ABRecordRef后,我是否必须在同一个线程中从ABRecordRef检索数据,还是可能是另一个线程?我还有一个ABRecordRef的包装器,所以当我从AB检索一个联系人时,我填充了人包装器对象,之后我从原始线程中使用它(从ABRecordRef读取).
  • 当我使用AB UI API(人员选择器导航控制器,新人视图控制器等)并将它们传递给我的ABAddressBook实例时,我不得不担心API不会在同一个线程中使用这个AB实例.创造了吗?我已经看到我可以传递NULL而不是AB实例,然后API将使用自己的AB,但是当我想修改联系人时我该怎么办?在这种情况下,我必须将它传递给ABRecordRef实例...
  • 还有其他我没想到的东西吗?

先感谢您.

-
迈克尔

Eri*_*ric 4

您只能从调用 ABAddressBookCreate() 的同一线程访问通讯簿。您不能在另一个线程中使用 ABRecordRef。只有记录 ID 和复制的数据才能在线程之间安全传递。

通常,我创建一个串行调度队列并将其用作不能阻塞主线程的地址簿调用的包装器。

当您使用 UI 时,您需要在主线程上调用 ABAddressBookCreate() 并将其用于 UI 调用。

如果您需要使用 UI 修改联系人,您可以修改该联系人,保存它,然后更新后台线程或队列上的地址簿,以便它包含最新的更改。为此,有一个通知回调 ABAddressBookRegisterExternalChangeCallback。