上一篇讨论到添加球员信息后,球员列表没有及时得到修改。这是由于之前我们简单地使用了一个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];
- }
相关推荐
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...
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 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支持事务处理,确保一组操作要么全部成功,...