avi*_*hic 7 core-data fault nsfetchedresultscontroller nsfetchrequest ios
背景 - 批处理不存在:
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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1364 次 |
| 最近记录: |