我正在創建一個基本上讀取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