将 JSON 数据插入 Core Data 存储需要很长时间

Posted

技术标签:

【中文标题】将 JSON 数据插入 Core Data 存储需要很长时间【英文标题】:Inserting JSON data into Core Data store is taking too long 【发布时间】:2015-02-17 15:03:37 【问题描述】:

我正在使用 Core Data 提供离线支持。从外部 API 获取 JSON 响应,并在后台登录时将数据插入本地存储。导入检索 5000+ 条记录,大约需要 1.5 分钟。

这是我将数据插入本地数据库的代码。

- (void)insertProspectListDataInProspectTable:(NSMutableDictionary*)tempDict

      int prospectID = [[tempDict valueForKey:@"ProspectID"] intValue];

        Prospects *prospect = nil;

        NSMutableArray *prospectListArray = [self isProspectAlreadyExistsWithProspectID:prospectID];
        if ([prospectListArray count] > 0) 

            prospect = [prospectListArray objectAtIndex:0];
        else 
            prospect = (Prospects *)[NSEntityDescription insertNewObjectForEntityForName:PROSPECTS_ENTITY inManagedObjectContext:self.managedObjectContext];
        

        //Prospect ID
        [prospect setProspectID:[NSNumber numberWithInt:prospectID]];

        //Subscriber Name
        [prospect setSubscriberName:[tempDict valueForKey:@"SubscriberName"]];

        //Attention
        [prospect setAttention:(([tempDict valueForKey:@"Attention"] == [NSNull null] )?@"":[tempDict valueForKey:@"Attention"])];

        //Email
        [prospect setEMail:(([tempDict valueForKey:@"EMail"] == [NSNull null] )?@"":[tempDict valueForKey:@"EMail"])];

        //Lead Date
        NSString *leadDate = (([tempDict valueForKey:@"LeadDate"] == [NSNull null])?@"":[tempDict valueForKey:@"LeadDate"]);
        [prospect setLeadDate:[GenricUI convertToMMDDYYYYFromYYYYMMDDFormate:leadDate]];

        NSError *error;
        if (![self.managedObjectContext save:&error]) 
            // This is a serious error saying the record could not be saved.
            // Advise the user to restart the application
        else 
            //  [self showSavedSuccessAlert];
        

我想提高我的应用程序的性能。有什么食谱吗?

【问题讨论】:

【参考方案1】:

这需要很长时间,因为对于每个收到的对象,您都在进行单独的提取。我能想到 3 种可能的解决方案:

    如果内存使用量与您无关(对象很小),您可以使用 NSDictionary,其中键为 prospectIDs,并保留所有 db 对象。 您可以在本地保留上次同步的日期,服务器会为每个对象添加编辑日期和创建日期。如果对象的编辑日期比上次同步日期更新,则您必须更新/创建该对象(取决于创建日期)。否则,您不必费心。 您还可以在 Core Data Programming Guide 的“高效实施查找或创建”部分中找到可能的解决方案

【讨论】:

【参考方案2】:

没有足够的信息来确切地知道问题出在哪里。第一步是使用 TimeProfiler 仪器检查运行情况。这将允许专注于瓶颈的确切位置。

一些第一步改进:

将上下文的保存推迟到所有记录都已加载,而不是每条记录。 @Levi 提到在服务器上实现 last_sync 属性 确保 dateformtting 代码不会为每条记录创建新的 dateformatter(不确定该部分是如何实现的,但每次创建 dateFormatter 都很昂贵)。 如果之后仍然存在问题,那么有新的 CoreData 批处理 API 会更快(但更高级的路由绕过 Coredata 的验证)

【讨论】:

【参考方案3】:

您可以创建一个具有后台模式的“ManageObjectContext”,以便在不阻塞主线程的情况下更新您的核心数据库。

您可以从以下教程中清楚地了解多上下文: 1.http://www.cocoanetics.com/2012/07/multi-context-coredata/ 2.http://robots.thoughtbot.com/core-data

【讨论】:

以上是关于将 JSON 数据插入 Core Data 存储需要很长时间的主要内容,如果未能解决你的问题,请参考以下文章

使用 Magical Record 将对象数组插入 Core Data

在 UI 测试中将模拟数据插入 Core Data

将 JSON 中的多对一关系保存到 Core Data

无法将 NSDate 从 Parse 存储到 Core Data

从 Core Data 创建一个 json 文件

为啥 Core Data 插入需要越来越长的时间?