7

背景 - 批量无故障:
NSFetchRequest 允许批量无故障 - 例如,使用 1000 个结果的查询,它会将所有结果都作为故障,然后一次对 X 个对象进行无故障(即索引 0-20,然后是 21-40 等)

当在 NSFetchResultsController 中用于 UITableViewDataSource 时,这种行为非常棒,并且它允许快速 UI 滚动,因为它不会逐个处理对象。

现在我的问题是:
我正在对对象列表使用有序关系,比如说Posts

由于Post可能出现在我的模型的许多列表中,因此我无法将其索引存储在Post实体的每个列表中,并将其用作排序结果的参数。

至于现在,我还没有找到 NSFetchRequest 按照这个顺序去取的方法,所以我不能使用它的批量无故障。所以我正在处理与索引的关系,我最终一个接一个地无误,这会导致滚动颠簸。

NSFetchResultsController 有没有办法根据订单关系进行获取?或者,是否有一个非私有的批处理无故障 API?

4

2 回答 2

3

目前我有一个解决方案,但不是一个干净的解决方案:
我想以有序的关系按 20 组无故障地批处理。

因此,每次我处理一个索引除以 20(索引 % 20 == 0)的索引时,我都会为接下来的 20 使用一个新的 NSFetchRequest 并通过调用一个通用字段名称来消除它们的错误。

- (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;
}
于 2013-06-25T08:19:07.140 回答
1

我希望我正确理解了你的问题,

我找到了答案,请看adonoho的答案和评论

NSFetchedResultsController 和 NSOrderedSet 关系

于 2013-06-20T17:16:06.697 回答