核心数据:编辑许多属性滞后性能

时间:2012-04-26 20:26:26

标签: iphone objective-c core-data nsarray

我有一个包含36行的数组,这是从CoreData获取的。每行有三个属性:podNumber,pieceNumber和colorNumber。

我想要做的是以六人为一组洗牌。这样每个吊舱有六个,这些将为该组洗牌。

我能够有效地做到这一点;但是,当我使用随机值更新CoreData时,性能明显缓慢。我想说完成循环需要1-1.5秒。

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

我发现第一种方法稍快一点。有没有人对如何加快这一点有任何见解?是否有更有效的方法来更新大批核心数据。我是否需要将其作为后台进程以及如何工作。

感谢。 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]);
        }
    }
}

2 个答案:

答案 0 :(得分:1)

正如timthetoolman指出的那样,击中磁盘的IO就是杀手。您需要做的是将所有数据存储在内存中,进行编辑,然后立即保存。

Core Data Programming Guide的{​​{3}}有一些有用的提示,说明如何提高效果。

答案 1 :(得分:0)

对于您尝试的任一方法,在运行嵌套循环后保存managedobjectContext。 MOC保存正在击中磁盘并导致速度减慢。除非你操纵100或1000的物体,否则你会想要大步节省MOC。

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

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

祝你好运