后台 – 批量卸载:
NSFetchRequest允许批量处理 – 例如,使用1000个结果的查询,它会将所有内容作为错误,然后它将一次解除X对象(即索引0-20,然后是21-40等)
NSFetchRequest允许批量处理 – 例如,使用1000个结果的查询,它会将所有内容作为错误,然后它将一次解除X对象(即索引0-20,然后是21-40等)
当在NSFetchResultsController中用于UITableViewDataSource时,此行为非常好,并且它允许快速UI滚动,因为它不会逐个解除对象.
现在我的问题:
我正在使用对象列表的有序关系,让我们说Posts.
由于Post可能出现在我模型的很多列表中,因此我无法将其索引存储在Post实体的每个列表中,并将其用作订购结果的参数.
至于现在,我还没有找到NSFetchRequest按照这个顺序获取的方法,所以我不能使用它的批量取消.所以我正在解决与索引的关系,我最终逐个取消,导致颠簸滚动.
NSFetchResultsController是否有任何方法可以根据订单关系获取?
或者,是否存在批量不支持的API,它不是私有的?
解决方法
目前我有一个解决方案,但不是一个干净的解决方案:
我希望按照有序关系中的20个小组进行批量修改.
我希望按照有序关系中的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; }