我在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:@".."];
答案 0 :(得分:1)
您通常不应使用fetchedObjects
。它将始终是获取对象的完整列表,其中一些可能在内存中,一些可能是错误。
重点是您希望FRC仅在需要时加载数据(到故障对象)。但是,要做到这一点,你需要根据你的UI可以在任何时间显示的内容(可以同时在屏幕上显示的最大项目数)来判断加载多少。
为此,您需要在fetchBatchSize
上设置NSFetchRequest
。完成后,FRC将根据需要加载一个新的“页面”结果(到内存中)(滚动UI并向FRC发出新的数据请求)。
从技术上讲,不是FRC正在这样做,它是fetch返回的数组对象,最初包含“空”对象,并且根据需要透明地对批量对象进行故障处理。