2011-01-05 31 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

相關問題