将 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
,其中键为 prospectID
s,并保留所有 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