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

即使设备上的通讯录有时也会变空(删除)。
每10-20次使用该应用程序后。

所以,我有几个问题:

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

  • 先感谢您。

    --
    麦可

    最佳答案

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

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

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

    如果需要使用UI修改联系人,则可以修改联系人,将其保存,然后在后台线程或队列上更新通讯簿,以使其包含最新更改。为此,有一个通知回调ABAddressBookRegisterExternalChangeCallback。

    关于multithreading - iPhone : address book is erased sometimes,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4722227/

    10-09 05:19