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

时间:2015-02-17 15:03:37

标签: ios objective-c json core-data bulkinsert

我使用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];
        }
}

我想提高应用程序的性能。任何食谱?

3 个答案:

答案 0 :(得分:0)

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

  1. 如果内存使用与您无关(对象很小),您可以使用密钥为NSDictionary的{​​{1}},并保留所有数据库对象。
  2. 您可以在本地保留上次同步的日期,服务器会为每个对象添加编辑日期和创建日期。如果对象的编辑日期比上一个同步日期更新,则必须更新/创建该对象(具体取决于创建日期)。否则你就不必费心了。
  3. 您还可以在Core Data Programming Guide,“有效实施查找或创建”部分找到可能的解决方案

答案 1 :(得分:0)

没有足够的信息来确切地知道问题所在。第一步是使用TimeProfiler工具检查运行。这将使我们能够专注于瓶颈的确切位置。

进行了几项改进:

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

答案 2 :(得分:0)

最好你可以用后台模式创建一个'ManageObjectContext`来更新核心数据库,而不会阻塞主线程。

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