我有一个restfull应用程序,它从Web服务下载json内容。我第一次调用Web服务时,会将所有对象缓存在核心数据中。 当我再次打电话时出现问题。 我需要更新已更改的,删除不存在的并插入所有新的。我获取所有本地对象和所有收到的对象,循环插入或更新,然后删除未修改的对象。问题是我的算法糟透了,而且效率非常低。保持核心数据与Web服务同步的最佳做法是什么?
编辑:
func updateRestaurantsFromJson(dataArray:[[String: AnyObject]]) {
var currentRestaurants = getAllRestaurants()
for restaurantDictionary in dataArray {
if let restaurant = DBRestaurant.fromJson(restaurantDictionary) {
if let index = find(currentRestaurants, restaurant) {
currentRestaurants.removeAtIndex(index)
}
}
}
removeRestaurants(currentRestaurants)
}
我正在创建一个包含所有当前对象的数组,在DBRestaurant.fromJson中插入/更新并删除未触及的对象。
class func fromJson(data: [String: AnyObject]) -> DBRestaurant? {
if let id = data["id"] as? String {
var obj = DBRestaurant.withId(id)
var result: DBRestaurant
if obj == nil {
result = newRestaurant()
result.restaurantID = id
} else {
result = obj!
}
result.updateWithJson(data)
DataManager.save(nil)
return result
} else {
return nil
}
}
class func withId(id: String) -> DBRestaurant? {
let fetchRequest = NSFetchRequest(entityName: kDBRestaurant)
fetchRequest.predicate = NSPredicate(format: "restaurantID = %@", id)
let restaurant = (self.managedObjectContext.executeFetchRequest(fetchRequest, error: nil) as! [DBRestaurant]).first
return restaurant
}
答案 0 :(得分:0)
当您使用JSON获取数据时,我假设您正在使用 Key:value 数据。
如果是这种情况,我会给每个对象存储一个identifier
属性。这可以是应用程序可用于标识对象的任何内容,如字符串或int。
然后,如果您获取对象,则只需将获取对象的标识符与CoreData中对象的标识符进行比较:
if fetchedObject.identifier == coreDataObject.identifier {
//you already have the object
} else {
//you don't
}
虽然这听起来很简单,但在我使用REST API完成的所有项目中,这些标识符属性对我有用,而且你的情况似乎相同。
希望有所帮助