我的应用程序需要使用Web服务并在json中获取一些数据。 我需要解析json并在我的persistance存储中提供数据,一切都很好,直到我在实际设备中测试我的应用程序,应用程序看起来像是拿着它直到我感到沮丧然后最后它在我脸上x - (
这里我有一个insertOrReplaceObjectForEntityForName
的方法+(id) insertOrReplaceObjectForEntityForName:(NSString *)entityName inManagedObjectContext:_context WithPredicateString:(NSString *)predicateString, ...{
NSManagedObject *object;
va_list ap;
va_start(ap, predicateString);
NSFetchRequest *req = [[NSFetchRequest alloc] initWithEntityName:entityName];
NSPredicate *pred = [NSPredicate predicateWithFormat:predicateString arguments:ap];
[req setPredicate:pred];
int count = [_context countForFetchRequest:req error:nil];
if(count > 0){
NSArray *arr = [_context executeFetchRequest:req error:nil];
object = [arr objectAtIndex:0];
}
else{
object = [NSEntityDescription insertNewObjectForEntityForName:entityName inManagedObjectContext:_context];
}
va_end(ap);
return object;
}
这里一行的简单操作大约需要.004秒,并且在解析数据时我必须执行此操作大约1000次以及许多其他操作,这使得我的解析过程非常繁重。我的默认数据库中已经有很多药物,我必须检查药物是否存在,如果存在,我必须编辑它的值。
Drug *drug = [NSEntityDescription insertOrReplaceObjectForEntityForName:@"Drug" inManagedObjectContext:parsingContext WithPredicateString:[NSString stringWithFormat:@"drugId == '%@'",[drugDetails objectForKey:@"DrugId"]]];
我正在使用核心数据来保持应用程序中的历史记录,但现在我认为我需要远离核心数据而忘记保留历史记录,除非这里有人可以帮助我。 我已经花了很多时间来制作我的应用程序,现在客户端正在打我的腿,任何建议??
答案 0 :(得分:1)
约杰什,
您看到的延迟并非特别来自Core Data,而是来自iOS设备上的闪存速度慢。你如何缓解这种情况?
Flash读取非常大的块(我告诉128kB)然后必须将它们丢弃在数据库分散 - 聚集操作中。因此,您希望从每次获取中获取尽可能多的数据。
您的代码会在json中对每个项目进行一次获取。如果您使用了仪器的低级工具,就像我在我的应用程序中那样,您很可能会看到您的应用程序大部分都在闲置等待闪存。
使用in
谓词运算符构建聚合提取。 IOW,将所有drugID
收集到一个集合或数组中。顺便说一句,根据您的json,这通常可以使用-valueForKey:
使用一行代码来完成。与此谓词格式一样:
@"drugId in'%@'", [drugDetails valueForKey:@"DrugId"]
其中drugDetails
是一个对象数组。此搜索允许DB聚合其所有页面提取。然后它返回一个已存在的记录数组。然后,您可以轻松地使用设置操作来选择更新或创建记录。然后,您可以将它们刷新为一个-save:
闪烁。
安德鲁