Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 使用从服务器检索的实际数据重新创建CoreData实体的最佳实践_Ios_Core Data_Afnetworking - Fatal编程技术网

Ios 使用从服务器检索的实际数据重新创建CoreData实体的最佳实践

Ios 使用从服务器检索的实际数据重新创建CoreData实体的最佳实践,ios,core-data,afnetworking,Ios,Core Data,Afnetworking,目的:我必须从文件中创建实体 因此,实体在CoreData中表示我的数据模型,文件中包含该实体的所有信息 我从网上得到的所有文件。为此,我使用AFNetworking框架 如何获取文件(算法): 请求plist文件。Plist文件具有指向我必须下载的其他URL的值 当plist下载到设备上的“我的文档”目录时。我解析它 当我解析plist时,我从NSDictionary中表示该plist的每个项中获取url 然后我从这个URL请求zip文件 下载zip文件后,我将其解压并转到下一步 解析解压文件

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

因此,实体在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特性或模式有助于创建更干净的系统来理解代码。当然,我可以比较两个文件并加载它,但我想看看如何在代码中创建更简单的文件。无论如何,感谢您的回复。