iOS从服务器同步对象的json列表
Posted
技术标签:
【中文标题】iOS从服务器同步对象的json列表【英文标题】:iOS synchronize json list of objects from server 【发布时间】:2015-05-28 15:37:00 【问题描述】:我希望将 http 请求结果与我的 Core Data 数据库同步。例如非常基础的类:
class Category: NSManagedObject
@NSManaged var id: NSNumber
@NSManaged var name: String
@NSManaged var imageUrl: String
我有这种方法可以从请求中获取结果:
apiManager.getRequestJsonParse(Constants.Server.BackendUrl + "categories?lang=cs", completion: (result, error) -> Void in
completion(categories: [], error: error)
)
结果是从 json 解析的字典。没关系,但现在我想将字典解析到我的类,检查数据库中是否存在,是否存在更新属性,如果不存在则向数据库添加新类别。
我之前在应用程序中使用的方法是我有两个类:Category 和 CategoryCD(类似于 Core Data 的 CD),首先我将 json 解析为 Category 类,而不是检查所有类别是否有 CategoryCD(保存在 CD 中)具有相同的 Id 然后更新,或添加或其他东西。
现在我正在考虑是否有更好的方法可以做到这一点。每次下载新结果时,我都可以删除该类的数据库,然后添加所有结果。这种方式的问题是,如果我有一些我想保留的课程怎么办。就像如果我下载并保存图像,那么我宁愿在课程和保存的图像之间保持联系。
我正在考虑我的旧方法,但将 2 个几乎相同的类(1 个用于核心数据,1 个相同但用于解析)减少到 1 个核心数据类。但是当我初始化这个类时,我必须总是在数据库中创建一个问题,对吗?所以它可能很复杂。
你用什么来做这个?我认为这是非常普遍的问题。你有项目列表,我想让它们离线可用(我之前下载的所有数据)但是当我连接到互联网时,我想用新结果更新(不是从服务器下载全部,只是我要求的响应) .
【问题讨论】:
【参考方案1】:这是一个非常普遍的问题,已经解决了数百种方法。顺便说一句,这不是“同步”,而是“缓存”以供离线使用。
不要创建两个对象,因为那是多余的。仅创建 Core Data 对象作为解析的一部分。
标准的 JSON 解析如下所示:
-
使用 NSJSONSerializer 转换为对象。
使用 KVO 从 JSON 对象中获取所有唯一 ID
根据 uniqueID 从 Core Data 获取所有现有对象
插入当前不存在的所有对象
如果您要更新对象,那么 #4 会同时进行。
在 *** 上搜索,您会发现很多关于如何做到这一点的示例。
【讨论】:
【参考方案2】:我在我的一个应用中做了类似的事情。 这是一些获取项目并更新它的通用代码。如果它不存在,它会创建它。
func insertOrUpdateManagedObject(id: Int16, name: String) -> YourManagedObject?
var managedObject: YourManagedObject?
if let context = self.managedObjectContext
if let fetchResult = fetchManagedObjectWithId(id)
managedObject = fetchResult
managedObject?.name = name
else
managedPhrase = NSEntityDescription.insertNewObjectForEntityForName("YourManagedObject", inManagedObjectContext: context) as? YourManagedObject
managedObject?.id = id
managedObject?.name = name
println("Created a managed object \(managedObject)")
return managedObject
【讨论】:
该代码的性能会很糟糕。您正在为每个单独的对象进行提取以确定它是否存在。那是对磁盘的 N 次命中。相反,您应该使用 KVO 从传入的 JSON 中获取所有唯一 ID,并对现有对象执行 ONE 调用磁盘。然后你就可以迭代了。 @MarcusS.Zarra 哦,我知道这一点。但是,这是针对单个条目的。我确信操作员可以调整代码以满足他的需求 当您编写这样的示例时,您最终会看到仅迭代此方法的代码。最好从一开始就清楚这样做的危险,以免 OP 抱怨 CD 很慢...... ;-) @MarcusS.Zarra 将在未来。谢谢你:) @Lytic,我的错误。我的意思是KVC。您可以使用valueForKeyPath:
来聚合 UniqueID。以上是关于iOS从服务器同步对象的json列表的主要内容,如果未能解决你的问题,请参考以下文章