我正在创建一个基本上读取XML文档并基于xml创建的对象创建tableview的iphone/ipad应用程序。 xml表示文件系统中的“级别”。它基本上是浏览器。核心数据 - 获取/创建NSManagedObject性能
每次我解析xml文档时,我都会更新在核心数据sqllite数据库中镜像的文件系统。对于在XML中遇到的每个“文件”,我尝试获取与它关联的NSManagedObject。
问题是我用来获取/创建一个新的空白实体或从数据库获取现有的一个函数。
+(File*)getOrCreateFile:(NSString*)remotePath
context:(NSManagedObjectContext*)context
{
struct timeval start,end,res;
gettimeofday(&start,NULL);
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"File" inManagedObjectContext:context];
[fetchRequest setEntity:entity];
[fetchRequest setFetchLimit:1];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"remotePath == %@",remotePath];
[fetchRequest setPredicate:predicate];
NSError *error;
NSArray *items = [context executeFetchRequest:fetchRequest error:&error];
[fetchRequest release];
File *f;
if ([items count] == 0)
f = (File*)[NSEntityDescription insertNewObjectForEntityForName:@"File" inManagedObjectContext:context];
else
f = (File*)[items objectAtIndex:0];
gettimeofday(&end, NULL);
[JFS timeval_subtract:&res x:&end y:&start];
count++;
elapsed += res.tv_usec;
return f;
}
对于eksample,如果我解析文档与200ish文件上的iPhone 3G的总时间约为4秒。其中3秒钟花费在这个函数中,从核心数据中获取物体。
RemotePath是一个可变长度的唯一字符串,并在sqllite数据库中建立索引。
我在这里做错了什么?或..我可以做得更好/不同以提高表现。
在数据模型中,每个文件夹与每个子文件夹(文件夹/文件)都有一对多的关系。我最终使用[NSFetchRequest setRelationshipKeyPathsForPrefetching:[NSArray arrayWithObject:@“children”],并且这将每个孩子都作为错误返回,然后每次都不用调用其他函数,而是使用NSPredicate在内存集合中搜索现在的孩子。原帖的4秒现在是1.5ish。 – 2010-10-01 08:32:07