Ios 使用从服务器检索的实际数据重新创建CoreData实体的最佳实践
目的:我必须从文件中创建实体 因此,实体在CoreData中表示我的数据模型,文件中包含该实体的所有信息 我从网上得到的所有文件。为此,我使用AFNetworking框架 如何获取文件(算法):Ios 使用从服务器检索的实际数据重新创建CoreData实体的最佳实践,ios,core-data,afnetworking,Ios,Core Data,Afnetworking,目的:我必须从文件中创建实体 因此,实体在CoreData中表示我的数据模型,文件中包含该实体的所有信息 我从网上得到的所有文件。为此,我使用AFNetworking框架 如何获取文件(算法): 请求plist文件。Plist文件具有指向我必须下载的其他URL的值 当plist下载到设备上的“我的文档”目录时。我解析它 当我解析plist时,我从NSDictionary中表示该plist的每个项中获取url 然后我从这个URL请求zip文件 下载zip文件后,我将其解压并转到下一步 解析解压文件
这是我的问题。我有本地存储和服务器上存储的文件版本,当服务器上的版本更改时,我需要用实际数据重新加载数据模型。错误的做法是再次从服务器加载所有数据,然后删除存储中的所有实体,并从新数据创建新实体。但这不是一种专业的方式,首先,其次,这是流量的额外负担,因为如果我只有一个实体需要重新加载,为什么我必须重新加载处于实际状态的其他实体。所以也许有人知道这个问题的最佳实践。当然,我可以创建我的解决方案,它会起作用,但我想看看人们如何解决这个问题,并找出我的解决方案与其他解决方案的区别。这很简单。您只需保留一个带有上次更新时间戳的属性,并从服务器请求更改的和新的实体即可。然后根据需要插入、更新或删除。听起来像是在谈论查找或创建。根据数据集的大小和您的性能要求,您可以通过以下两种方式完成此操作: 第一种方法是获取现有的核心数据对象,并将它们存储在字典中,其中实体的唯一属性用作键。然后,当您下载新数据时,您可以为每个已解析的对象使用此键,并检查字典以查找(并可选地更新)任何现有对象,或创建一个新对象:
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
}
第二种方法更复杂,涉及的内存开销更少。在的“高效导入数据”一节中介绍了这一点
该指南提供了一个良好的开端,但没有提供一个完整的解决方案;我在这里尝试了我自己的答案:是的,这真的很琐碎,但也许有人知道这个问题与解决方案的联系。我指的是它在代码中的外观,其中描述的算法和一些OOP特性或模式有助于创建更干净的系统来理解代码。当然,我可以比较两个文件并加载它,但我想看看如何在代码中创建更简单的文件。无论如何,感谢您的回复。