我正在使用NSFetchResultsController
,并且试图使分页正常工作。我在NSFetchRequest
上遇到了这两个属性,并强调了我对此有疑问的部分:
fetchLimit
(docs):
对于除SQL存储区以外的每个对象存储区,都会执行获取请求 有效地限制了提取操作,只需执行无限量的提取操作 丢弃未要求的行。
returnsObjectsAsFaults
(docs):
这些故障是受管对象,但是它们的所有属性数据 驻留在行缓存中,直到引发故障为止。当故障是 触发后,Core Data从行缓存中检索数据。
结合这两个属性是否合适?设置fetchLimit
并将returnsObjectsAsFaults
设置为true?
设置fetchLimit
时,CoreData
仍会查询每一行的所有内容。使用NSFetchResultController
时,我基于UITableViewCells
中的对象配置CoreData
,因此我认为对象不应作为故障返回。但是,如果我将这两个属性组合在一起,恐怕CoreData会基于文档在谓词中无限制地查询每一行,并查询整个对象(不是故障)。
我不确定是否应该同时使用这两个属性。是否有人对将NSFetchResultController
与分页结合使用的大型数据集有任何经验?我真的不知道该如何调试。
答案 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];