7

背景 - 批unfaulting:
NSFetchRequest允許批量unfault - 例如,使用1000個結果的查詢,它將把所有的錯誤,那麼它會unfault在X對象時間(即索引0-20,然後21-40等)CoreData有序關係 - 批unfaulting使用NSFetchRequest

在NSFetchResultsController中使用UITableViewDataSource時,此行爲非常好,並且它允許快速的UI滾動,因爲它並不是一個接一個的默認對象。

現在我的問題:
我使用對象列表排序關係,比方說帖子

由於可能會出現在我的模型很多名單,我不能將它的每一個列表索引存儲在實體,並用它作爲排序結果的PARAM。

至於現在,我還沒有找到一種方法讓NSFetchRequest根據這個順序來獲取,所以我不能使用它的批處理方式。所以我正在處理與索引的關係問題,最終導致一個接一個的錯誤,導致滾動不穩定。

NSFetchResultsController根據順序關係獲取有任何方法嗎? 或者,有沒有一個不私人的API?

回答

3

評論目前我有一個解決方案,而不是一個乾淨的其中一個:
我想按照有序關係按20個分組進行非缺省批處理。因此,每次我尋址一個索引時,它的索引被索引除以20(索引%20 == 0), 我使用新的NSFetchRequest爲未來的20和非默認他們通過調用一個公共字段名稱。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    if (indexPath.row % 20 == 0) { 
     NSArray *objectsToUnfault = [[someObject.orderedRelationship array] subarrayWithRange:NSMakeRange(indexPath.row, MIN(20, [someObject.orderedRelationship count] - indexPath.row))]; 
     // It's important to hold on this array, otherwise objects fault back 
     self.lastPrefetch = [self preFetchEntityOfClass:[Post class] faultObjects:objectsToUnfault error:&error]; 
    } 
//... continue and create cell 
} 


- (NSArray *)preFetchEntityOfClass:(Class)entityClass faultObjects:(NSArray*)objects error:(NSError **)error { 
    NSEntityDescription *entityDescription = [NSEntityDescription entityForName:NSStringFromClass(entityClass) inManagedObjectContext:self.managedObjectContext]; 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF in %@", objects]; 
    NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
    [request setEntity:entityDescription]; 
    [request setPredicate:predicate]; 
    [request setFetchBatchSize:MIN([objects count], 20)]; 
    NSArray *results = [self.managedObjectContext executeFetchRequest:request error:error]; 
    // I assume all my objects has this field "uid" 
    NSArray *resultsUid = [results valueForKey:@"uid"]; //Batch unfaulting (results is a BatchFaultArray, private class type) 
    if ([resultsUid count] != [results count]) { 
     NSLog(@"Error: wrong count of uids"); //We need to use resultsUid, to avoid compiler opt 
    } 
    return results; 
} 
+1

這是一個很好的解決方法 –