NSFetchResultController,结合使用fetchLimit和returnObjectsAsFaults进行分页

时间:2019-03-03 12:50:02

标签: swift core-data

我正在使用NSFetchResultsController,并且试图使分页正常工作。我在NSFetchRequest上遇到了这两个属性,并强调了我对此有疑问的部分:

fetchLimitdocs):

  

对于除SQL存储区以外的每个对象存储区,都会执行获取请求   有效地限制了提取操作,只需执行无限量的提取操作   丢弃未要求的行

returnsObjectsAsFaultsdocs):

  

这些故障是受管对象,但是它们的所有属性数据   驻留在行缓存中,直到引发故障为止。当故障是   触发后,Core Data从行缓存中检索数据。

结合这两个属性是否合适?设置fetchLimit并将returnsObjectsAsFaults设置为true?

设置fetchLimit时,CoreData仍会查询每一行的所有内容。使用NSFetchResultController时,我基于UITableViewCells中的对象配置CoreData,因此我认为对象不应作为故障返回。但是,如果我将这两个属性组合在一起,恐怕CoreData会基于文档在谓词中无限制地查询每一行,并查询整个对象(不是故障)。

我不确定是否应该同时使用这两个属性。是否有人对将NSFetchResultController与分页结合使用的大型数据集有任何经验?我真的不知道该如何调试。

1 个答案:

答案 0 :(得分:0)

使用NSPredicate和fetchLimits和fetchOffsets可以做到。

CDAppDelegate * delegate = (CDAppDelegate*)[[UIApplication sharedApplication] delegate];
NSManagedObjectContext * context = [delegate managedObjectContext];
for(int i = 0; i < 34;i++){
    CDObject * object = [NSEntityDescription insertNewObjectForEntityForName:@"CDObject"
                                                      inManagedObjectContext:context];
    [object setValue:i];
}
[delegate saveContext];

NSFetchRequest* request = [[[NSFetchRequest alloc] init] autorelease];
[request setEntity:[NSEntityDescription entityForName:@"CDObject"
                               inManagedObjectContext:context]];

 NSError* error = nil;

 NSUInteger count = [context countForFetchRequest:request error:&error];
 assert(error == nil);

 NSLog(@"Total count: %u", count);

 request.fetchOffset = 0;    
 request.fetchLimit = 30;

 NSLog(@"Fetch offset: %u, limit: %u", request.fetchOffset, request.fetchLimit);

 NSArray* page1 = [context executeFetchRequest:request error:&error];
 assert(error == nil);

 NSLog(@"Page 1 count: %u", page1.count);

 request.fetchOffset = 30;    
 request.fetchLimit = 30;

 NSLog(@"Fetch offset: %u, limit: %u", request.fetchOffset, request.fetchLimit);

 NSArray* page2 = [context executeFetchRequest:request error:&error];
 assert(error == nil);

 NSLog(@"Page 2 count: %u", page2.count);

[request release];