iOS从服务器同步json对象列表
我希望将http请求结果与我的核心数据数据库同步。例如,非常基本的类:iOS从服务器同步json对象列表,ios,objective-c,json,swift,core-data,Ios,Objective C,Json,Swift,Core Data,我希望将http请求结果与我的核心数据数据库同步。例如,非常基本的类: class Category: NSManagedObject { @NSManaged var id: NSNumber @NSManaged var name: String @NSManaged var imageUrl: String } 我有一个从请求中获取结果的方法: apiManager.getRequestJsonParse(Constants.Server.Backend
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(类似CD的核心数据),首先我将json解析为Category类,而不是所有类别,我检查任何CategoryCD(保存在CD中)是否具有相同的Id,然后进行更新、添加或其他操作
现在我在想,如果有更好的方法,我该怎么做。每次下载新结果时,我都可以删除该类的数据库,然后添加所有结果。这种方法的问题是,如果我想保留某些类的内容,该怎么办。就像我下载并保存图像一样,我宁愿在类和保存的图像之间保持连接
我在考虑我的旧方法,但将2个几乎相同的类(1个用于核心数据,1个相同但用于解析)减少为1个核心数据类。但当我初始化这个类时,有一个问题,我必须总是在数据库中创建,对吗?所以这可能很复杂
你用什么做这个?我认为这是很常见的问题。您有项目列表,我希望它们可以脱机使用(使用我以前下载的所有数据),但当我连接到internet时,我希望更新新的结果(不是从服务器下载所有内容,而是我请求的响应) 我在我的一个应用程序中做了类似的事情。 下面是一些获取并更新项目的通用代码。如果它不存在,它就会创建它
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
}
这是一个非常普遍的问题,已经有数百种方法解决了。顺便说一句,这不是“同步”,而是“缓存”供脱机使用 不要创建两个对象,因为这是多余的。作为解析的一部分,只创建核心数据对象 标准JSON解析如下所示:
在Stackoverflow上搜索,你会发现很多这样做的例子。该代码的性能会非常糟糕。您正在对每个单独的对象进行提取,以确定它是否存在。这是N次磁盘点击。相反,您应该使用KVO从传入的JSON获取所有uniqueid,并为现有对象对磁盘执行一次调用。然后你可以重复。@MarcusS.Zarra哦,我知道。但是,这是针对单个条目的。我相信op可以调整代码以满足他的需要。当您编写这样的示例时,您最终看到的代码只是在这个方法上迭代。最好从一开始就清楚这一点的危险性,以免OP抱怨CD慢…;-)@马库斯·扎拉将来会。谢谢你:)我错了。我是说KVC。您可以使用
valueForKeyPath:
来聚合uniqueid。