从Web服务更新核心数据。 (插入/更新/删除)

时间:2015-06-23 13:45:29

标签: swift rest core-data insert-update

我有一个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
}

1 个答案:

答案 0 :(得分:0)

当您使用JSON获取数据时,我假设您正在使用 Key:value 数据。 如果是这种情况,我会给每个对象存储一个identifier属性。这可以是应用程序可用于标识对象的任何内容,如字符串或int。

然后,如果您获取对象,则只需将获取对象的标识符与CoreData中对象的标识符进行比较:

if fetchedObject.identifier == coreDataObject.identifier {
    //you already have the object 
} else {
    //you don't
}

虽然这听起来很简单,但在我使用REST API完成的所有项目中,这些标识符属性对我有用,而且你的情况似乎相同。

希望有所帮助