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

Posted

技术标签:

【中文标题】核心数据:编辑许多属性滞后性能【英文标题】:Core Data: Editing many attributes laggy performance 【发布时间】:2012-04-26 20:26:26 【问题描述】:

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

我想要做的是将结果按六人一组随机排列。这样每个 pod 有 6 个部分,这些部分将针对该组进行洗牌。

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

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

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

谢谢。 乔丹

这里是方法一:

//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 Guide 的 Efficiently Importing Data 提供了一些有用的提示,告诉您可以采取哪些措施来提高性能。

【讨论】:

【参考方案2】:

对于您尝试的任何一种方法,在运行完嵌套循环后保存 managedobjectContext。是 MOC 保存击中磁盘并导致速度变慢。除非您正在操作 100 或 1000 的对象,在这种情况下,您会想要跨过 MOC 保存。

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

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

祝你好运

【讨论】:

这确实加快了速度。我只需要将 [managedObjectContext save:&error] 移出 for 循环。

以上是关于核心数据:编辑许多属性滞后性能的主要内容,如果未能解决你的问题,请参考以下文章

编辑核心数据中的属性

使用表格视图编辑核心数据中单个属性的正确方法

xCode 4.2 核心数据如何在数据模型编辑器中使用 GUI 创建获取的属性?

核心数据:从详细视图编辑对象

核心数据编辑器和 NSManagedObjectSublcass 之间的差异

ASP.Net核心模型日期属性在编辑模式下为空