我有一個NSFetchedResultsController並存儲在覈心數據的大量數據的所述讀取的結果控制器必須取。大約有46,000件物品最終會被抓取。問題在於獲取時間超過8秒,並且整個過程中,UI被凍結,因爲我們必須在主線程上獲取。我想知道我能做些什麼來加快速度?優化NSFetchedResultsController取
我可以通過創建日期排序的對象,該找取請求具有100批量大小,且謂詞不是過於複雜。它通過UID,類型和其擁有者的UID過濾對象。
由於用戶可以搜索,抓取謂詞會改變,所以具有讀取的結果控制器上的高速緩存,似乎毫無意義,當它只是被刪除每次取謂詞的變化。
它直接關係到在覈心數據對象的數量,因爲在切換到具有較少對象的帳戶減小急劇提取時間。 (6000個物體需要的時間少於一秒)。有什麼方法可以使這個更具擴展性?我的代碼如下:
- (NSFetchRequest *)getFetchRequest
{
NSFetchRequest *fetchRequest = [NSFetchRequest requestWithEntityName:@"Photo"];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:NO];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];
[sortDescriptor release];
[fetchRequest setPredicate:[self getFetchPredicates]];
[fetchRequest setFetchBatchSize:100];
return fetchRequest;
}
- (NSPredicate *)getFetchPredicates {
NSMutableArray *predicates = [NSMutableArray arrayWithObjects:
[NSPredicate predicateWithFormat:@"life_uid == %@",[[LoginManager shared] currentLifeUID]],
[NSPredicate predicateWithFormat:@"(type == %@) OR (type == %@)", TLTypeImage, TLTypeVideo],
[NSPredicate predicateWithFormat:@"(ANY stories.permission.owner_person_uid == %@ OR [email protected] == 0)", [[LoginManager shared] currentPersonUID]],
nil];
NSArray *filteredMomentIDs = [[self searchTerms] objectForKey:TLLibraryViewControllerSearchTermsPhotoIDsKey];
if ([filteredMomentIDs count] > 0 && [self searchMode] == kTLLibrarySearchModeTag)
{
[predicates addObject:[NSPredicate predicateWithFormat:@"uid in %@", filteredIDs]];
}
return [NSCompoundPredicate andPredicateWithSubpredicates:predicates];
}
如果您可以添加(a)您的謂詞,以及(b)您正在搜索的字段的類型(字符串,整數等),這將有所幫助。 – 2013-03-01 17:46:38
您是否嘗試在提取謂詞中使用的屬性上設置索引? – 2013-03-01 17:47:15
你提到你的謂詞過濾器'...他們所有者的UID'。根據我的經驗,關係可以對提取性能產生重大影響。可能值得通過刪除謂詞的部分來測試對速度的影響。 – ChrisH 2013-03-01 17:57:02