我在我的应用程序中使用ABAddressBook
。
对AB的访问来自单独的线程,以释放UI。
我知道以下事实:必须始终从同一线程访问AB实例,因此我建立了一个包装器。
包装器是一个单例,它维护自己的后台线程。
所有到达包装器的消息都将自动重定向到后台线程,而调用线程将等到实现结束,最后将相关数据(联系人列表,特定联系人等)填充到out参数中。
即使设备上的通讯录有时也会变空(删除)。
每10-20次使用该应用程序后。
所以,我有几个问题:
先感谢您。
--
麦可
最佳答案
您只能从名为ABAddressBookCreate()的同一线程访问通讯簿。您不能在另一个线程中使用ABRecordRef。只有记录ID和复制的数据可以安全地在线程之间传递。
通常,我创建一个串行调度队列,并将其用作不能阻塞主线程的地址簿调用的包装。
使用UI时,需要在主线程上调用ABAddressBookCreate()并将其用于UI调用。
如果需要使用UI修改联系人,则可以修改联系人,将其保存,然后在后台线程或队列上更新通讯簿,以使其包含最新更改。为此,有一个通知回调ABAddressBookRegisterExternalChangeCallback。
关于multithreading - iPhone : address book is erased sometimes,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4722227/