1

我目前正在开发一个聊天应用程序,我需要保留一份 cncontact 商店列表以匹配应用程序中收件人的姓名和详细信息。当用户有一个非常大的地址簿时,我很难过。我在后台线程上运行此任务,但它有时会减慢应用程序的速度,并且有时地址簿上的最新更新不会反映在应用程序中。

处理大型地址簿列表时的方法是什么,我应该如何继续维护它?我是否应该将其全部存储在 ManagedContext 中并在每次打开应用程序时重新检查它,因为更新发生时来自 Apple 的通知不会始终反映在应用程序中?只是想知道有多大的聊天应用程序可以在不阻塞 UI 的情况下进行列表的妙招,并且它始终是最新的。任何帮助将非常感激。

4

1 回答 1

0

您真的需要在应用程序中存储此列表的副本吗?我怀疑出于安全原因,这也应该是必要的。作为用户,我对我的联系人列表被镜像到应用程序没有很好的感觉。

不是只有当用户打开联系人列表或想写新消息时才需要这个列表吗?您可以使用以下技术

  • 列表视图的分页,即仅加载 20 个联系人并在用户滚动时加载更多
  • 用于在用户类型时加载联系人的谓词:CNContact.predicateForContacts(matchingName: "Appleseed")
  • 联系人框架有一个很好的 API 来获取部分联系人数据。有些数据比其他数据更耗时。仅获取您真正需要的内容:let keysToFetch = [CNContactGivenNameKey, CNContactFamilyNameKey] as [CNKeyDescriptor]

仅获取包含部分数据的联系人

let store = CNContactStore()
do {
    let predicate = CNContact.predicateForContacts(matchingName: "Appleseed")
    let contacts = try store.unifiedContacts(matching: predicate, keysToFetch: keysToFetch)
    print("Fetched contacts: \(contacts)")
} catch {
    print("Failed to fetch contact, error: \(error)")
    // Handle the error
}

您可以在官方文档中阅读更多相关信息

于 2021-02-15T10:47:29.543 回答