multithreading - iPhone : address book is erased sometimes

标签 multithreading ios abaddressbook abrecordref

我在我的应用中使用了 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/

相关文章:

ios - Swift 将 NSTimeInteval 转换为 NSDate

ios - 核心数据 : Segue to detail controller with newly created ManagedObject

ios - ABAddressBookGetPersonWithRecordID 返回零

ios - 通过电话、电子邮件、姓名在地址簿中查找 ios ABRecordRef 联系人

ios - 如何编辑 ABAddressBook 上的记录

c# - 这是状态消息显示的最佳方式吗?

c# - C#两个几乎相同的线程,性能差异很大

java - 使用 Java,这种类型的设置和方法调用线程安全吗?

IOS构建警告: the transform cache was reset

asp.net - 在 ASP.NET 网站中锁定车队