设备中的核心数据性能问题

时间:2012-05-07 17:36:32

标签: iphone performance core-data ios-simulator device

我的应用程序需要使用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"]]];

我正在使用核心数据来保持应用程序中的历史记录,但现在我认为我需要远离核心数据而忘记保留历史记录,除非这里有人可以帮助我。 我已经花了很多时间来制作我的应用程序,现在客户端正在打我的腿,任何建议??

1 个答案:

答案 0 :(得分:1)

约杰什,

您看到的延迟并非特别来自Core Data,而是来自iOS设备上的闪存速度慢。你如何缓解这种情况?

Flash读取非常大的块(我告诉128kB)然后必须将它们丢弃在数据库分散 - 聚集操作中。因此,您希望从每次获取中获取尽可能多的数据。

您的代码会在json中对每个项目进行一次获取。如果您使用了仪器的低级工具,就像我在我的应用程序中那样,您很可能会看到您的应用程序大部分都在闲置等待闪存。

使用in谓词运算符构建聚合提取。 IOW,将所有drugID收集到一个集合或数组中。顺便说一句,根据您的json,这通常可以使用-valueForKey:使用一行代码来完成。与此谓词格式一样:

@"drugId in'%@'", [drugDetails valueForKey:@"DrugId"]

其中drugDetails是一个对象数组。此搜索允许DB聚合其所有页面提取。然后它返回一个已存在的记录数组。然后,您可以轻松地使用设置操作来选择更新或创建记录。然后,您可以将它们刷新为一个-save:闪烁。

安德鲁