我有一系列的NSFetchedResultsControllers爲一些表格視圖提供動力,並且它們在設備上的表現糟糕透頂,大約在幾秒鐘內。由於它全部在主線程上運行,它在啓動時阻止了我的應用程序,這並不是很好。使用SQLite後端修復預測的NSFetchedResultsController/NSFetchRequest性能?
我調查,原來,謂語的問題是:
NSPredicate *somePredicate = [NSPredicate predicateWithFormat:@"ANY somethings == %@", something];
[fetchRequest setPredicate:somePredicate];
即抓取實體,稱之爲「東西」,與實體「東西」一多對一對多的關係。這個謂詞是一個過濾器,它將結果限制爲只與某個特定「某事」有關係的事物。
當我刪除測試謂詞時,從4秒到100ms或更短的時間(對於某些極端情況),取出時間(初始performFetch:call)是可接受的。儘管如此,我卻對此感到困擾,因爲它否定了我希望通過Core Data和NSFRC獲得的很多好處,否則這些好處似乎是一個強大的工具。
所以,我的問題是,我該如何優化這個性能?我使用謂詞錯誤?我應該以某種方式修改模型/模式嗎?還有其他什麼方法可以解決這個問題?這種性能是否會降低? (有數百< 1KB對象的順序。)
,詳情編輯:
下面的代碼:
[fetchRequest setFetchLimit:200];
NSLog(@"before fetch");
BOOL success = [frc performFetch:&error];
if (!success) {
NSLog(@"Fetch request error: %@", error);
}
NSLog(@"after fetch");
更新日誌(以前,我有一些應用的低效率降低這些是更新的日誌,應該儘可能接近最佳狀態,因爲您可以在當前環境下獲得):
2010-02-05 12:45:22.138 Special Ppl[429:207] before fetch
2010-02-05 12:45:22.144 Special Ppl[429:207] CoreData: sql: SELECT DISTINCT 0, t0.Z_PK, t0.Z_OPT, <model fields> FROM ZTHING t0 LEFT OUTER JOIN Z_1THINGS t1 ON t0.Z_PK = t1.Z_2THINGS WHERE t1.Z_1SOMETHINGS = ? ORDER BY t0.ZID DESC LIMIT 200
2010-02-05 12:45:22.663 Special Ppl[429:207] CoreData: annotation: sql connection fetch time: 0.5094s
2010-02-05 12:45:22.668 Special Ppl[429:207] CoreData: annotation: total fetch execution time: 0.5240s for 198 rows.
2010-02-05 12:45:22.706 Special Ppl[429:207] after fetch
如果我做同樣的獲取,而不謂詞(通過註釋掉的問題開始的兩行):在次
2010-02-05 12:44:10.398 Special Ppl[414:207] before fetch
2010-02-05 12:44:10.405 Special Ppl[414:207] CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, <model fields> FROM ZTHING t0 ORDER BY t0.ZID DESC LIMIT 200
2010-02-05 12:44:10.426 Special Ppl[414:207] CoreData: annotation: sql connection fetch time: 0.0125s
2010-02-05 12:44:10.431 Special Ppl[414:207] CoreData: annotation: total fetch execution time: 0.0262s for 200 rows.
2010-02-05 12:44:10.457 Special Ppl[414:207] after fetch
20倍的差距。 500ms並不是很好,而且似乎沒有辦法在後臺線程中執行它,或者以其他方式優化我能想到的。 (除了進入一個二進制商店,這是一個非問題,所以我可能會這樣做。二進制商店的性能持續~100毫秒的上述200對象謂詞查詢。)
(我在此之前嵌套另一個問題,我現在moved away)。
我想這與多對多關係的ANY檢查有關,但是,如果這是問題,我會在這種情況下與Core Data分享您的失望。 – gerry3 2010-02-04 05:46:28
一個隨機想法:不要使用謂詞獲取;相反,獲取所有內容並修改運行時行爲。 (例如,在tableviewcontroller中,如果對象與謂詞不匹配,則顯示其高度爲0的行)。但是,這將是愚蠢的。 – Jaanus 2010-02-05 18:29:26