`
dcj3sjt126com
  • 浏览: 1871552 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Core Data浅谈系列之七 : 使用NSFetchedResultsController

    博客分类:
  • IOS
阅读更多
上一篇讨论到添加球员信息后,球员列表没有及时得到修改。这是由于之前我们简单地使用了一个NSMutableArray来管理球员列表,需要我们额外做一些变更通知。而在Core Data和UITableView之间,存在这一个名为NSFetchedResultsController的类为我们提供更多方便。
 
从很大程度上来看,NSFetchedResultsController是为了响应Model层的变化而设计的。
在使用NSFetchedResultsController之前,我们需要为其设置一个NSFetchRequest,且这个fetchRequest必须得有一个sortDescriptor,而过滤条件predicate则是可选的。
接着,还需要一个操作环境,即NSManagedObjectContext。
通过设置keyPath,就是将要读取的entity的(间接)属性,来作为section分类key。
之后,我们为其设置可选的cache名称,以避免执行一些重复操作。
最后,可以设置delegate,用来接收响应变化的通知。 
  1. #pragma mark -   
  2. #pragma mark - NSFetchedResultsController  
  3.   
  4. - (NSFetchedResultsController *)fetchedResultsController  
  5. {  
  6.     if (nil != _fetchedResultsController) {  
  7.         return _fetchedResultsController;  
  8.     }  
  9.   
  10.     NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init] autorelease];  
  11.     NSEntityDescription *playerEntity = [NSEntityDescription entityForName:@"Player" inManagedObjectContext:self.cdViewController.managedObjectContext];  
  12.     [fetchRequest setEntity:playerEntity];  
  13.   
  14.     NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"age"ascending:YES];  
  15.     [fetchRequest setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];  
  16.   
  17.     NSPredicate *predicate = [NSPredicate predicateWithFormat:@"team == %@", self.team];  
  18.     [fetchRequest setPredicate:predicate];  
  19.     [fetchRequest setFetchBatchSize:20];  
  20.   
  21.     _fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.cdViewController.managedObjectContext sectionNameKeyPath:nil cacheName:@"Players"];  
  22.     _fetchedResultsController.delegate = self;  
  23.   
  24.     NSError *error = NULL;  
  25.     if (![_fetchedResultsController performFetch:&error]) {  
  26.         NSLog(@"Unresolved error %@, %@", error, [error userInfo]);  
  27.         abort();  
  28.     }  
  29.   
  30.     return _fetchedResultsController;  
  31. }  
这时候,我们将取消掉之前的playerArray,而是将self.fetchedResultsController作为UITableView的数据源:
  1. #pragma mark -  
  2. #pragma mark - UITableView DataSource  
  3.   
  4. - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView  
  5. {  
  6.     return [[self.fetchedResultsController sections] count];  
  7. }  
  8.   
  9. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section  
  10. {  
  11.     return [[[self.fetchedResultsController sections] objectAtIndex:section] numberOfObjects];  
  12. }  
  13.   
  14. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath  
  15. {  
  16.     staticNSString *cellIdentifier = @"TeamTableViewCellIdentifier";  
  17.     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];  
  18.   
  19.     if (nil == cell) {  
  20.         cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier] autorelease];  
  21.     }  
  22.   
  23.     [self configureCell:cell atIndexPath:indexPath];  
  24.   
  25.     return cell;  
  26. }  
  27.   
  28. - (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath  
  29. {  
  30.     Player *playerObject = [self.fetchedResultsController objectAtIndexPath:indexPath];  
  31.     cell.imageView.backgroundColor = [UIColor redColor];  
  32.     cell.textLabel.text = playerObject.name;  
  33.     cell.detailTextLabel.text = [playerObject.age stringValue];  
  34.     cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;  
  35. }  
为了在添加球员信息后,返回到上一个界面立即可以看到,我们需要重写对响应变化的代理函数。
这里有一份经典用法代码片段,不过Demo里采取的是简单有效的方法,因为不需要动画效果(并且适用于大批量数据的更新): 
  1. #pragma mark -  
  2. #pragma mark - NSFetchedResultsController Delegate  
  3.   
  4. - (void)controllerDidChangeContent:(NSFetchedResultsController *)controller  
  5. {  
  6.     [self.playerTable reloadData];  
  7. }  
做完以上工作,在添加完球员信息后,UITableView立刻可以得到刷新。

分享到:
评论

相关推荐

    Core.Data.in.Swift.Data.Storage.and.Management.for.iOS.and.OSX

    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 上此答案的补充

    CoreDataSegueDemo 使用 NSFetchedResultsController 并在视图之间发送数据作为 StackOverflow 上此答案的补充: ://stackoverflow.com/a/27514083/3810673

    Pro Core Data for IOS

    本书《Pro Core Data for iOS》以完全更新的形式针对Xcode 4.2版本,涵盖了iOS SDK 5环境下Core Data框架的使用方法。Core Data是苹果公司推出的数据存储和检索技术,它对于开发者来说易于上手,但深入掌握却颇具...

    Core Data by Tutorials

    《Core Data by Tutorials》是一本专注于教授iOS开发者如何使用苹果公司的Core Data框架的教程书籍,它详尽地介绍了从基础到高级的Core Data技能。这本书特别为iOS 8和Xcode环境编写,提供了系统性地从零开始构建...

    Core Data By Tutorials

    《Core Data By Tutorials》是一本专注于使用Swift语言实现Core Data的iOS开发教程,由Ray Wenderlich网站的教程团队编著,包括Aaron Douglas、Saul Mora、Matthew Morey和Pietro Rea等人。此书详细介绍了如何使用...

    ZSWHierarchicalResultsController:替换 NSFetchedResultsController。 这不是支持单个对象数组,而是为每个对象公开一个部分

    ZSWH分层结果控制器 ZSWHierarchicalResultsController是进行更换NSFetchedResultsController 。 此类不支持单个对象数组,而是为每个对象显示一个部分,以及每个部分内的一组有序对象。 这个类既快速又经过良好测试...

    Core Data By Tutorials 最新swift版

    从创建第一个Core Data应用,到创建NSManagedObject的子类,再到搭建Core Data堆栈,以及中高级的数据获取方法、使用NSFetchedResultsController管理数据变化、数据版本和迁移管理、iCloud同步、单元测试以及性能的...

    Core_Data_by_Tutorials_v2.0

    通过本书的学习,读者可以掌握如何创建自己的Core Data应用程序、如何使用NSManagedObject子类以及如何构建高效的Core Data栈等关键技术。 #### 第一部分:基础知识与入门 **第一章:您的第一个Core Data应用程序*...

    Core.Data.by.Tutorials.iOS.8.and.Swift.Edition.2014.12.pdf

    根据提供的文件信息,我们可以推断出这是一本关于使用Swift语言和iOS 8进行Core Data开发的教程书籍。下面将从各个章节入手,提取并解释关键知识点。 ### 核心知识点概览 #### 1. **概述** - **目标读者**:本书...

    Core Data小例子

    Core Data是苹果开发框架中的一个核心组件,主要用于应用...通过这个"Core Data小例子",开发者不仅能学会如何在实际项目中使用Core Data,还能深入理解其背后的工作原理,从而更好地在iOS应用中管理复杂的数据需求。

    列表显示 core data 数据

    在提供的"cookbook7_18_7"文件中,可能包含了示例代码或教程,详细展示了如何在实际项目中使用`NSFetchedResultsController`来显示和更新Core Data数据。通过研究这些资源,你可以更深入地理解这一强大的功能,并将...

    Core.Data.by.Tutorials.Code.v2.0.zip

    《Core Data by Tutorials》是一本专注于iOS和macOS开发中的数据管理框架——Core Data的教程书籍。v2.0版本的示例代码提供了一系列深入的实践案例,帮助开发者掌握这个强大的持久化存储技术。Core Data是Apple为iOS...

    【Pro.Core.Data.for.iOS.2nd.Edition】[PDF+源代码] [iPhone/iPad/iOS]

    《Pro.Core.Data.for.iOS.2nd.Edition》是针对iPhone、iPad和iOS设备的一本深入讲解Core Data技术的专业书籍。这本书的第二版提供了全面而详细的知识,帮助开发者掌握苹果平台上的数据管理核心——Core Data框架。...

    ios开发care data的使用

    本文将深入探讨如何在iOS应用中使用Core Data来管理Care Data,通过提供的"iPhoneCoreDataRecipes"工程代码,我们可以学习到具体的应用实践。 首先,Core Data并不是一个数据库,但它可以与SQLite、Binary或In-...

    core data程序代码

    在这个"core data程序代码"的示例中,开发者可能还包含了UI部分,如表视图或集合视图,它们与Core Data的 NSFetchedResultsController 集成,自动响应数据模型的变化,并实时更新界面。 在实际项目中,Core Data还...

    Core_Data_by_Tutorials_Source_Code_swift_v_1_2

    5. **Chapter 5 - NSFetchedResultsController**:NSFetchedResultsController是Core Data中的一个强大工具,用于在表视图中动态地显示和管理数据。这里会详细讲解如何配置和使用它,以及如何处理数据更改。 6. **...

    Core_Data_by_Tutorials_v_1_2

    此外,还涉及了从创建第一个Core Data应用、NSManagedObject的子类、Core Data堆栈、高级查询、使用NSFetchedResultsController管理查询结果、数据版本和迁移、与iCloud同步、单元测试、性能提升,以及多个...

    Pro Core Data for iOS, Second Edition

    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 ...

    Core Data 数据操作

    利用`NSFetchedResultsController`,我们可以轻松地将Core Data的查询结果与`UITableView`或`UICollectionView`绑定,实现数据的实时更新。 7. **事务处理**: Core Data支持事务处理,确保一组操作要么全部成功,...

Global site tag (gtag.js) - Google Analytics