使用从服务器检索的实际数据创建Core Data实体的最佳实践

时间:2013-06-06 11:50:59

标签: ios core-data afnetworking

目的:我必须从文件创建实体。

因此,实体在CoreData中表示我的数据模型,文件包含此实体的所有信息。

我从互联网上获得的所有文件。为此,我使用了AFNetworking框架。

我如何获取文件(算法):

  1. 请求plist文件。 Plist文件包含我必须下载的其他网址的值。
  2. 当plist下载到设备上的Documents目录时。我解析它。
  3. 当我解析plist时,我从NSDictionary中代表这个plist的每个项目中获取url。
  4. 然后我从这个网址请求zip文件。
  5. 下载zip文件后,我将其解压缩并转到下一步。
  6. 解析解压缩的文件并创建数据模型。
  7. 这是我的问题。我有本地存储的文件版本,存储在服务器上,当服务器上的版本发生变化时,我需要用实际数据重新加载我的数据模型。从服务器再次加载所有数据的坏方法是删除存储中的所有实体并从新数据中创建新实体。但它首先不是专业的方式,而且它是流量的额外负担,因为如果我只需要重新加载一个实体,为什么我必须重新加载处于实际状态的其他实体。所以也许有人知道这个问题的最佳实践。当然,我可以创建我的解决方案并且它可以工作,但我想看看人们如何解决这个问题,并找出我的解决方案和其他解决方案中的差异。

2 个答案:

答案 0 :(得分:1)

这是微不足道的。您只需使用上次更新的时间戳保留一个属性,只需从服务器请求已更改的实体和新实体。然后根据需要插入,更新或删除。

答案 1 :(得分:0)

听起来你在谈论发现或创造。根据数据集的大小和性能要求,您可以通过以下几种方式执行此操作:

第一种方法是获取现有的Core Data对象并将它们存储在一个字典中,该字典具有作为键的实体的唯一属性。然后,当您下载新数据时,您可以为每个已解析的对象获取此密钥,并检查您的字典以查找(并可选地更新)任何现有对象,或创建一个新对象:

NSArray *fetchedObjects = //Fetch the existing objects;    

NSMutableDictionary *existingObjects = [NSMutableDictionary dictionary];

for (MyClass *object in fetchedObjects)
    [existingObjects setObject:object forKey:object.uniqueKey];

//Now iterate through the new data (using JSON as example here)

NSDictionary *downloadedItems = //Download data and serialise into JSON

for (NSDictionary *item in downloadedItems){

    NSString *uniqueValue = [item valueForKey:@"uniqueKey"];

    MyClass *object = [existingObjects objectForKey:uniqueValue];

    if (object==nil){

       object = //Insert new MyClass entity into MOC
       object.uniqueKey = uniqueValue;

       //Set any other values you only need to set once
    }

    //Set any values you may need to update every time
    //This would be where to check a modified date attribute
}

第二种方式更复杂,并且涉及更少的内存开销。它在Core Data Programming Guide的“有效导入数据”部分中进行了描述。

该指南提供了一个良好的开端,但没有提供完整的解决方案;我在这里的答案中尝试了自己:Basic array comparison algorithm