2012-04-26 105 views
2

我有一个从CoreData获取的36行数组。每行有三个属性:podNumber,pieceNumber和colorNumber。核心数据:编辑许多属性laggy性能

我想要做的是将结果以六个小组进行洗牌。这样每个吊舱有六个部分,这些部分将被洗牌。

我能够有效地做到这一点;然而,当我用随机数值更新CoreData时,性能显然很低。我会说完成循环需要1-1.5秒。

我尝试了两种方法:1)删除从CoreData旧数组和添加新的一个2)搜索在光盘中的唯一的行和更新

我发现的第一个方法是稍快。有没有人对我如何加快速度有所了解?是否有更有效的方式来更新大量核心数据。我是否需要将其作为后台进程,以及如何工作。

谢谢。 MJ

这里是方法一:

//Fetch them all and then delete them all 
NSFetchRequest * fetchPieceColors = [[NSFetchRequest alloc] init]; 
[fetchPieceColors setEntity:[NSEntityDescription entityForName:@"PieceColors" inManagedObjectContext:managedObjectContext]]; 
[fetchPieceColors setPredicate:[NSPredicate predicateWithFormat:@"(game = %@)",games]]; 
[fetchPieceColors setIncludesPropertyValues:NO]; 

NSError * error = nil; 
NSArray * pieceColor = [managedObjectContext executeFetchRequest:fetchPieceColors error:&error]; 
[fetchPieceColors release]; 
for (NSManagedObject * piece in pieceColor) { 
    [managedObjectContext deleteObject:piece]; 
} 
NSError *saveError = nil; 
[managedObjectContext save:&saveError]; 



//Add back 
for (int b=0;b<6;b++) { 
    for (int j=0;j<6;j++) { 
     NSError *error; 
     NSManagedObject *fetchPieceColors = [NSEntityDescription 
            insertNewObjectForEntityForName:@"PieceColors" 
            inManagedObjectContext:managedObjectContext]; 
     [fetchPieceColors setValue:[NSNumber numberWithInt:b] forKey:@"podNumber"]; 
     [fetchPieceColors setValue:[NSNumber numberWithInt:j] forKey:@"pieceNumber"]; 
     [fetchPieceColors setValue:[shuffledArray objectAtIndex:(b*6)+j] forKey:@"colorNumber"]; 
     [fetchPieceColors setValue:games forKey:@"game"]; 


     if (![managedObjectContext save:&error]) 
     { 
      NSLog(@"Problem saving: %@", [error localizedDescription]); 
     } 
    } 
} 

回答

1

由于timthetoolman指出它是击中磁盘是杀手的IO。你需要做的是获得内存中的所有数据,进行编辑,然后一次保存。

Core Data Programming GuideEfficiently Importing Data对您可以采取哪些措施来提高性能有一些有用的提示。

0

无论哪种方法,你正试图,保存managedobjectContext您可通过嵌套循环运行后。这是MOC保存在磁盘并造成减速。除非你操纵100或1000的物体,在这种情况下,你会想要跨越你的MOC节省。

MOC是一个便笺簿,可以保存所有的编辑内容,直到您保存为止。因此,您可以等待完成操作后保存它们。

我不会删除对象并重新创建它们。这只是不必要的颠簸到磁盘。

好运

+0

那肯定会加快速度。我只需将[managedObjectContext save:&error]移出for循环。 – 2012-04-26 20:51:44