1

我的应用程序需要使用 Web 服务并在 json 中获取一些数据。我需要解析 json 并在我的持久性存储中提供数据,一切都运行良好,直到我在实际设备中测试我的应用程序,应用程序看起来就像它一直持有它,直到我感到沮丧,然后最后它在我的脸上拉屎 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;
}

在这里,一条线的简单操作大约需要 0.004 秒,在解析数据时,我必须结合许多其他操作执行大约 1000 次此操作,这使得我的解析过程过于繁重。我的默认数据库中已经有很多药物,我必须检查药物是否存在,如果存在,我必须编辑它的值。

Drug *drug = [NSEntityDescription insertOrReplaceObjectForEntityForName:@"Drug" inManagedObjectContext:parsingContext WithPredicateString:[NSString stringWithFormat:@"drugId == '%@'",[drugDetails objectForKey:@"DrugId"]]];

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

4

1 回答 1

1

约格什,

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

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

您的代码对 json 中的每个项目进行提取。如果您使用 Instruments 的低级工具,就像我在我的应用程序中使用的那样,您很可能会看到您的应用程序大部分时间都处于空闲状态,等待闪存。

in您使用谓词运算符构建聚合提取。IOW,去收集你所有的drugIDs 到一个集合或数组中。顺便说一句,根据您的 json,这通常可以通过使用-valueForKey:. 如这种谓词格式:

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

wheredrugDetails是一个对象数组。此搜索让数据库聚合其所有页面获取。然后它会返回一个已经存在的记录数组。然后,您可以轻松地使用集合操作来根据需要选择更新或创建记录。然后,您可以将它们刷新为单个-save:.

安德鲁

于 2012-05-08T15:08:23.750 回答