批量使用NSFetchRequest不合格

背景 - 批量不合法:
NSFetchRequest允许批处理为非默认 - 例如,使用1000个结果的查询,它会将所有错误都带出来,然后它会一次将非默认的X对象(即索引0-20,然后21-40等)

当在NSFetchResultsController中使用UITableViewDataSource时,这种行为非常好,并且它允许快速的UI滚动,因为它并不是一个接一个的默认对象。

现在到我的问题:
我使用对象列表的有序关系,让我们说帖子。

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

至于现在,我还没有找到一种方法让NSFetchRequest根据这个顺序来获取,所以我不能使用它的批处理方式。 所以我正在处理与索引的关系问题,最终导致一个接一个的错误,导致滚动不稳定。

NSFetchResultsController根据订单关系获取方法吗? 或者,是否存在一个不私密的API?


目前我有一个解决方案,但不是一个干净的:
我想按照有序的关系以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;
}

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

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

NSFetchedResultsController和NSOrderedSet关系

链接地址: http://www.djcxy.com/p/71993.html

上一篇: batch unfaulting using NSFetchRequest

下一篇: Can one monitor STM's contention level?