gpt4 book ai didi

swift - NSFetchResultController,用于分页的 fetchLimit 和 returnsObjectsAsFaults 的组合

转载 作者:搜寻专家 更新时间:2023-11-01 05:32:18 26 4
gpt4 key购买 nike

我正在使用 NSFetchResultsController 并且我正在尝试让分页工作。我在 NSFetchRequest 上遇到了这两个属性,并突出显示了我有疑问的部分:

获取限制(docs):

For every object store except the SQL store, a fetch request executed with a fetch limit in effect simply performs an unlimited fetch and throws away the unasked for rows.

returnsObjectsAsFaults ( docs ):

These faults are managed objects, but all of their property data resides in the row cache until the fault is fired. When the fault is fired, Core Data retrieves the data from the row cache.

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

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

我怀疑我是否应该同时使用这两个属性。有没有人有将大型数据集与 NSFetchResultController 结合使用并进行分页的经验?我真的不知道如何调试它。

最佳答案

通过使用 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];

关于swift - NSFetchResultController,用于分页的 fetchLimit 和 returnsObjectsAsFaults 的组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54968986/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com