2011-01-05 64 views
1

我有一个包含约500个对象的Core Data数据库。这些对象是将被用户查看和修改的'卡片'。当用户修改卡时,名为“groupNumber”的属性将会改变。将数据对象加载到NSArray会导致启动速度缓慢

这些卡在每个组中的顺序是非常重要的,由用户决定。我将数据库对象加载到一个数组中。当用户进行更改时,我使用'title'属性将数组的顺序保存到plist中。

我的问题来了,当应用程序重新启动。我需要按保存的顺序加载组数组。但是,当我使用plist来执行获取请求时,它非常缓慢。

慢的代码是:

// get array from plist sorted by 'title' 
NSMutableArray *group1Temp = [plistData objectForKey:@"group1ArrayData"]; 

for (int i = 0; i < [group1Temp count]; i++) { 
    // set predicate to 'title' attribute 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"title == %@", [group1Temp objectAtIndex:i]]; 

    // load filtered database object into temp array 
    NSArray *temp = [self.vocabDeckArray filteredArrayUsingPredicate:predicate]; 

    [self.group1Array addObjectsFromArray:temp]; 
} 

当这个执行500次,这实在是太慢了。如果我可以将数据库对象的NSArray保存到plist中,那么我不需要执行谓词搜索,但似乎我无法做到这一点。

我在想我的整个方法都是错误的。如何以更快的方式保存/加载数据库对象数组的顺序?将数据库对象加载到数组本身不好的做法?

感谢您的帮助!

回答

1

遍历整个vocabDeckArray并为每个对象在group1Temp中过滤一次效率非常低。有许多方法可以在小于O(n^2)的时间内重建这个有序数据集。

一个简单的选择可能是存储与对象的标题为键,数组作为值位置的字典。你可以构建已知长度的数组,并把每一个对象在vocabDeckArray成一个单一的传递正确的位置这样(从vocabDeckArray获得第一个对象,查找其中在group1Array从字典所属插入group1Array,移动到下一个对象)。这还不是特别快,但它似乎是对当前行为的最小改变。

除了考虑方法的数量你的循环中调用。 self.vocabDeckArrayself.group1Array是您在循环的每次迭代中进行的方法调用,即使它们总是返回相同的对象。保持引用这些对象的局部变量会在每次迭代时为您节省2个方法调用的开销。

+0

我完全按照你所说的做,只是存储一个对象标题数组而不是字典。您为我节省了大量工作,现在应用程序在3秒内加载完毕。非常感谢。 – shohaku 2011-01-06 04:27:03

相关问题