NSFetchedResultsController 是否一次获取所有结果?
Does NSFetchedResultsController fetch all results at once?
我在 Core Data 中有大量对象。以下是仅在需要时加载 UI 所需的内容,还是预先加载所有对象?
NSFetchedResultsController 确实有一个 fetchedObjects
属性.. 这是否意味着它会预先获取所有内容?解决此问题的正确方法是什么?
NSManagedObjectContext *context = # get from somewhere
NSManagedObjectModel *model = context.persistentStoreCoordinator.managedObjectModel;
NSDictionary *vars = @{...};
NSFetchRequest *fetchRequest = [model fetchRequestFromTemplateWithName:@"..."
substitutionVariables:vars];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"..." ascending:NO];
NSArray *sortDescriptors = @[sortDescriptor];
fetchRequest.sortDescriptors = sortDescriptors;
NSFetchedResultsController *controller = [[NSFetchedResultsController alloc]
initWithFetchRequest:request
managedObjectContext:context
sectionNameKeyPath:nil
cacheName:@".."];
您通常不应该使用 fetchedObjects
。它将始终是已获取对象的完整列表,其中一些可能在内存中,一些可能是错误的。
重点是您希望 FRC 仅根据需要加载数据(到故障对象)。但是,要做到这一点,您需要根据 UI 一次可以显示的内容(可以同时显示在屏幕上的最大项目数)来告诉它加载多少。
为此,您需要在 NSFetchRequest
上设置 fetchBatchSize
。完成后,FRC 将根据需要加载新的 'page' 结果(到内存中)(当滚动 UI 并向 FRC 发出新的数据请求时)。
从技术上讲,并不是 FRC 在执行此操作,而是 fetch 返回的数组对象,该对象最初包含 'empty' 个对象,并且根据需要透明地对批量对象进行故障处理。
我在 Core Data 中有大量对象。以下是仅在需要时加载 UI 所需的内容,还是预先加载所有对象?
NSFetchedResultsController 确实有一个 fetchedObjects
属性.. 这是否意味着它会预先获取所有内容?解决此问题的正确方法是什么?
NSManagedObjectContext *context = # get from somewhere
NSManagedObjectModel *model = context.persistentStoreCoordinator.managedObjectModel;
NSDictionary *vars = @{...};
NSFetchRequest *fetchRequest = [model fetchRequestFromTemplateWithName:@"..."
substitutionVariables:vars];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"..." ascending:NO];
NSArray *sortDescriptors = @[sortDescriptor];
fetchRequest.sortDescriptors = sortDescriptors;
NSFetchedResultsController *controller = [[NSFetchedResultsController alloc]
initWithFetchRequest:request
managedObjectContext:context
sectionNameKeyPath:nil
cacheName:@".."];
您通常不应该使用 fetchedObjects
。它将始终是已获取对象的完整列表,其中一些可能在内存中,一些可能是错误的。
重点是您希望 FRC 仅根据需要加载数据(到故障对象)。但是,要做到这一点,您需要根据 UI 一次可以显示的内容(可以同时显示在屏幕上的最大项目数)来告诉它加载多少。
为此,您需要在 NSFetchRequest
上设置 fetchBatchSize
。完成后,FRC 将根据需要加载新的 'page' 结果(到内存中)(当滚动 UI 并向 FRC 发出新的数据请求时)。
从技术上讲,并不是 FRC 在执行此操作,而是 fetch 返回的数组对象,该对象最初包含 'empty' 个对象,并且根据需要透明地对批量对象进行故障处理。