我的应用程序使用本地 iOS 联系人以及同一列表中的一些服务器联系人。
服务器联系人在启动时获取并保存在 NSManagedObjectContext
中。
每个服务器联系人都用 Contact 类表示,该类是 NSManagedObject
的子类。
我使用 CNContactStore
获取本地联系人。
问题是如何将这种“加入”到单个列表中。
我想到的是:
1.) 将服务器和本地联系人保存到与联系人对象相同的 NSManagedObjectContext
中,并从那里获取它。
-> 优点: - 抓取是统一的
-> 缺点: - 本地联系人在存储内存中加倍
- 如果用户从我们的应用程序中添加新的本地联系人,它不会自动显示在列表中
2.) 仅保存服务器联系人,每次用户访问联系人列表时获取本地联系人,并将其附加到列表中
优点: - 联系人仅保存一次,始终显示本地联系人更新
缺点 - 获取不是单一来源,这使使用 NSFetchResultController
也许还有别的办法?
那么,在同一个列表中显示缓存的服务器联系人和本地 iOS 联系人的最佳方式是什么?
最佳答案
如果是我,我宁愿将这两组联系人分开,而不是将它们合并在一个列表中。提供一些 UI,以便用户可以选择其设备的联系人数据库或应用程序的数据库,并与 NSManagedObject
分开处理 CNContact
。
如果这是不可能的(或者只是没有吸引力),我会做类似的事情
- 在我的核心数据存储中仅保存服务器联系人。
- 将我的
NSManagedObject
子类设计为具有CNMutableContact
类型的 transient 属性。每当我获取服务器联系人之一时,我都可以获得它的联系人样式对象,而无需将其保存到用户的联系人数据库中。 - 从 Core Data 中获取所有服务器联系人,并从
CNContactStore
中获取所有CNContact
实例,并使用第 2 步中的属性将结果合并到一个数组中。 - 显示该数组。当然,这意味着不使用
NSFetchedResultsController
,但这就是生活。
您可能还想对 CNMutableContact
进行子类化,以添加一个属性来存储创建它的托管对象的 NSManagedObjectID
。然后,如果用户编辑联系信息(如果允许),您可以使用它来找出需要更改的托管对象。
关于ios - 在同一列表/表格 View 中显示缓存的服务器联系人和本地 iOS 联系人,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35901458/