上一篇讨论到添加球员信息后,球员列表没有及时得到修改。这是由于之前我们简单地使用了一个NSMutableArray来管理球员列表,需要我们额外做一些变更通知。而在Core Data和UITableView之间,存在这一个名为NSFetchedResultsController的类为我们提供更多方便。
从很大程度上来看,NSFetchedResultsController是为了响应Model层的变化而设计的。
在使用NSFetchedResultsController之前,我们需要为其设置一个NSFetchRequest,且这个fetchRequest必须得有一个sortDescriptor,而过滤条件predicate则是可选的。
接着,还需要一个操作环境,即NSManagedObjectContext。
通过设置keyPath,就是将要读取的entity的(间接)属性,来作为section分类key。
之后,我们为其设置可选的cache名称,以避免执行一些重复操作。
最后,可以设置delegate,用来接收响应变化的通知。
- #pragma mark -
- #pragma mark - NSFetchedResultsController
- - (NSFetchedResultsController *)fetchedResultsController
- {
- if (nil != _fetchedResultsController) {
- return _fetchedResultsController;
- }
- NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init] autorelease];
- NSEntityDescription *playerEntity = [NSEntityDescription entityForName:@"Player" inManagedObjectContext:self.cdViewController.managedObjectContext];
- [fetchRequest setEntity:playerEntity];
- NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"age"ascending:YES];
- [fetchRequest setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];
- NSPredicate *predicate = [NSPredicate predicateWithFormat:@"team == %@", self.team];
- [fetchRequest setPredicate:predicate];
- [fetchRequest setFetchBatchSize:20];
- _fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.cdViewController.managedObjectContext sectionNameKeyPath:nil cacheName:@"Players"];
- _fetchedResultsController.delegate = self;
- NSError *error = NULL;
- if (![_fetchedResultsController performFetch:&error]) {
- NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
- abort();
- }
- return _fetchedResultsController;
- }
- #pragma mark -
- #pragma mark - UITableView DataSource
- - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
- {
- return [[self.fetchedResultsController sections] count];
- }
- - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
- {
- return [[[self.fetchedResultsController sections] objectAtIndex:section] numberOfObjects];
- }
- - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
- {
- staticNSString *cellIdentifier = @"TeamTableViewCellIdentifier";
- UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
- if (nil == cell) {
- cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier] autorelease];
- }
- [self configureCell:cell atIndexPath:indexPath];
- return cell;
- }
- - (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath
- {
- Player *playerObject = [self.fetchedResultsController objectAtIndexPath:indexPath];
- cell.imageView.backgroundColor = [UIColor redColor];
- cell.textLabel.text = playerObject.name;
- cell.detailTextLabel.text = [playerObject.age stringValue];
- cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
- }
为了在添加球员信息后,返回到上一个界面立即可以看到,我们需要重写对响应变化的代理函数。
这里有一份经典用法代码片段,不过Demo里采取的是简单有效的方法,因为不需要动画效果(并且适用于大批量数据的更新):
- #pragma mark -
- #pragma mark - NSFetchedResultsController Delegate
- - (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
- {
- [self.playerTable reloadData];
- }
相关推荐
CoreDataSegueDemo 使用 NSFetchedResultsController 并在视图之间发送数据作为 StackOverflow 上此答案的补充: ://stackoverflow.com/a/27514083/3810673
本书《Pro Core Data for iOS》以完全更新的形式针对Xcode 4.2版本,涵盖了iOS SDK 5环境下Core Data框架的使用方法。Core Data是苹果公司推出的数据存储和检索技术,它对于开发者来说易于上手,但深入掌握却颇具...
Core Data is intricate, powerful, and necessary. Discover the powerful capabilities integrated into Core Data, and how to use Core Data in your iOS and OS X projects. All examples are current for OS X...
《Core Data by Tutorials》是一本专注于教授iOS开发者如何使用苹果公司的Core Data框架的教程书籍,它详尽地介绍了从基础到高级的Core Data技能。这本书特别为iOS 8和Xcode环境编写,提供了系统性地从零开始构建...
《Core Data By Tutorials》是一本专注于使用Swift语言实现Core Data的iOS开发教程,由Ray Wenderlich网站的教程团队编著,包括Aaron Douglas、Saul Mora、Matthew Morey和Pietro Rea等人。此书详细介绍了如何使用...
ZSWH分层结果控制器 ZSWHierarchicalResultsController是进行更换NSFetchedResultsController 。 此类不支持单个对象数组,而是为每个对象显示一个部分,以及每个部分内的一组有序对象。 这个类既快速又经过良好测试...
从创建第一个Core Data应用,到创建NSManagedObject的子类,再到搭建Core Data堆栈,以及中高级的数据获取方法、使用NSFetchedResultsController管理数据变化、数据版本和迁移管理、iCloud同步、单元测试以及性能的...
通过本书的学习,读者可以掌握如何创建自己的Core Data应用程序、如何使用NSManagedObject子类以及如何构建高效的Core Data栈等关键技术。 #### 第一部分:基础知识与入门 **第一章:您的第一个Core Data应用程序*...
根据提供的文件信息,我们可以推断出这是一本关于使用Swift语言和iOS 8进行Core Data开发的教程书籍。下面将从各个章节入手,提取并解释关键知识点。 ### 核心知识点概览 #### 1. **概述** - **目标读者**:本书...
Core Data是苹果开发框架中的一个核心组件,主要用于应用...通过这个"Core Data小例子",开发者不仅能学会如何在实际项目中使用Core Data,还能深入理解其背后的工作原理,从而更好地在iOS应用中管理复杂的数据需求。
在提供的"cookbook7_18_7"文件中,可能包含了示例代码或教程,详细展示了如何在实际项目中使用`NSFetchedResultsController`来显示和更新Core Data数据。通过研究这些资源,你可以更深入地理解这一强大的功能,并将...
《Core Data by Tutorials》是一本专注于iOS和macOS开发中的数据管理框架——Core Data的教程书籍。v2.0版本的示例代码提供了一系列深入的实践案例,帮助开发者掌握这个强大的持久化存储技术。Core Data是Apple为iOS...
《Pro.Core.Data.for.iOS.2nd.Edition》是针对iPhone、iPad和iOS设备的一本深入讲解Core Data技术的专业书籍。这本书的第二版提供了全面而详细的知识,帮助开发者掌握苹果平台上的数据管理核心——Core Data框架。...
本文将深入探讨如何在iOS应用中使用Core Data来管理Care Data,通过提供的"iPhoneCoreDataRecipes"工程代码,我们可以学习到具体的应用实践。 首先,Core Data并不是一个数据库,但它可以与SQLite、Binary或In-...
在这个"core data程序代码"的示例中,开发者可能还包含了UI部分,如表视图或集合视图,它们与Core Data的 NSFetchedResultsController 集成,自动响应数据模型的变化,并实时更新界面。 在实际项目中,Core Data还...
5. **Chapter 5 - NSFetchedResultsController**:NSFetchedResultsController是Core Data中的一个强大工具,用于在表视图中动态地显示和管理数据。这里会详细讲解如何配置和使用它,以及如何处理数据更改。 6. **...
此外,还涉及了从创建第一个Core Data应用、NSManagedObject的子类、Core Data堆栈、高级查询、使用NSFetchedResultsController管理查询结果、数据版本和迁移、与iCloud同步、单元测试、性能提升,以及多个...
Fully updated for Xcode 4.2, Pro Core Data for iOS explains how to use the Core Data framework for iOS SDK 5 using Xcode 4.2. The book explains both how and why to use Core Data, from simple to ...
利用`NSFetchedResultsController`,我们可以轻松地将Core Data的查询结果与`UITableView`或`UICollectionView`绑定,实现数据的实时更新。 7. **事务处理**: Core Data支持事务处理,确保一组操作要么全部成功,...