我在我的应用中使用了 ABAddressBook
。
对AB的访问是从一个单独的线程来释放UI的。
我知道必须始终从同一个线程访问 AB 实例这一事实,因此我构建了一个包装器。
包装器是一个单例,它维护自己的后台线程。
所有到达包装器的消息都会自动重定向到后台线程,而调用线程会一直等到执行结束,最后用相关数据(联系人列表、特定联系人等)填充 out 参数。
尽管如此,设备上的地址簿有时会变空(删除)。
每使用 10-20 次应用程序后。
所以,我有几个问题:
- 在专用线程中从 AB 获取 ABRecordRef 后,我是否还必须在同一线程中从 ABRecordRef 检索数据,或者可能是另一个线程?我还有一个 ABRecordRef 的包装器,所以当我从 AB 检索联系人时,我填充了 person 包装器对象,然后我从原始线程使用它(从 ABRecordRef 读取)。
- 当我使用 AB UI API(人物选择器导航 Controller 、新人物 View Controller 等)并将我的 ABAddressBook 实例传递给它们时,我是否必须担心 API 不会使用来自创建它的同一个线程?我看到我可以传递 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/