我在我的应用中使用ABAddressBook
对AB的访问来自单独的线程以释放UI
我知道对AB实例的访问必须始终来自同一个线程,因此我构建了一个包装器。
包装器是一个单例,它维护自己的后台线程
来到包装器的所有消息都会自动重定向到后台线程,而调用线程会一直等到实现结束,最后用相关数据(联系人列表,特定联系人等)填充out参数。 / p>
即使设备上的地址簿有时也会被清空(擦除) 每10-20次使用该应用程序。
所以,我几乎没有问题:
提前谢谢。
-
迈克尔
答案 0 :(得分:4)
您只能从调用ABAddressBookCreate()的同一线程访问通讯簿。您不能在另一个线程中使用ABRecordRef。只有记录id和复制的数据才能安全地在线程之间传递。
通常,我创建一个串行调度队列,并将其用作无法阻止主线程的通讯簿调用的包装器。
当您使用UI时,您需要在主线程上调用ABAddressBookCreate()并将其用于您的UI调用。
如果您需要修改与UI的联系人,您可以修改联系人,保存联系人,然后更新后台线程或队列中的地址簿,以便它包含最新的更改。为此目的,有一个通知回调ABAddressBookRegisterExternalChangeCallback。