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

这是一个很好的解决方法 –