在同一 list/tableview 中显示缓存的服务器联系人和本地 iOS 联系人

Showing cached server contact and local iOS contact in the same list/tableview

我的应用程序使用本地 iOS 联系人以及同一列表中的一些服务器联系人。 服务器联系人在启动时获取并保存在 NSManagedObjectContext 中。 每个服务器联系人都用联系人 class 表示,它是 NSManagedObject 的子 class。

我使用 CNContactStore 获取的本地联系人。

问题是如何将这个 "joining" 处理成单个列表。

我想到的是:

1.) 将服务器和本地联系人保存到与联系人对象相同的 NSManagedObjectContext 中,并从那里获取。 -> 优点: - 抓取是统一的 -> 缺点: - 本地联系人在存储内存中加倍 - 如果用户从我们的应用程序中添加新的本地联系人,它不会自动显示在列表中

2.) 仅保存服务器联系人,每次用户访问联系人列表时获取本地联系人,并将其附加到列表中 优点: - 联系人仅保存一次,始终显示本地联系人更新 缺点 - 获取不是单一来源,这使使用 NSFetchResultController

的事情变得复杂

也许还有其他方法?

那么,在同一个列表中显示缓存的服务器联系人和本地 iOS 联系人的最佳方式是什么?

如果是我,我宁愿将这两组联系人分开,也不愿将它们合并到一个列表中。提供一些 UI 以便用户可以 select 他们设备的联系人数据库或您应用程序的数据库,并与 NSManagedObject.

分开处理 CNContact

如果那不可能(或者只是没有吸引力),我会做类似的事情

  1. 在我的 Core Data 存储中只保存 个服务器联系人。
  2. 将我的 NSManagedObject 子类设计为具有 CNMutableContact 类型的瞬态 属性。每当我获取其中一个服务器联系人时,我都可以获得一个联系人样式的对象,而无需将其保存到用户的联系人数据库中。
  3. 从 Core Data 中获取我所有的服务器联系人,从 CNContactStore 中获取所有 CNContact 实例,并使用步骤 2 中的 属性 将结果合并到一个数组中。
  4. 显示那个数组。当然,这意味着不使用 NSFetchedResultsController,但这就是生活。

您可能还想对 CNMutableContact 进行子类化,以添加一个 属性 来存储创建它的托管对象的 NSManagedObjectID。然后,如果用户编辑联系信息(如果允许的话),您可以使用它来找出您需要更改的托管对象。