FetchedResultsController与CoreData-创新互联

NSFetchedResultsController是为了让视图及时响应Model层的变化而设计的,更具体的将是配合刷新UITableView上的数据。

创新互联建站是一家专注于网站建设、做网站与策划设计,白城网站建设哪家好?创新互联建站做网站,专注于网站建设十年,网设计领域的专业建站公司;建站业务涵盖:白城等地区。白城做网站价格咨询:028-86922220

一般而言,NSFetchedResultsController的实例是由UITableViewController的实例初始化并持有。

创建后,我们将给它分配一个代理(NSFetchedResultsControllerDelegate),当Core Data中的model有变化时,通过代理通知到对应的tableView。

  1. 对象的新增:新增的对象无法关联到fetchedResultsController,一般是通过 [NSEntityDescription insertNewObjectForEntityForName:@"Post" inManagedObjectContext:managedObjectContext]的方式初始化并赋值,并保存( [managedObjectContext save:&error]),此处采用的是一致的managedObjectContext,会触发NSFetchedResultsChangeInsert通知。

  2. 对象的更新:在某些需求中,对象可能是后台异步得到json数据,然后同步进数据库中的。直接对该对象更新,并保存( [managedObjectContext save:&error])。

  3. 对象的删除:通过在一致的managedObjectContext上删除对应的model对象,会触发NSFetchedResultsChangeDelete通知。并且会将其相关的cascade关系的对象一起删除,无需单独操作。 [post.managedObjectContext deleteObject:post];

官方推荐的方式,是尽量在代理的didChangeObject方法中处理tableView上对section或者row的更新。不管对对象的操作是通过NSArray还是NSFetchedResultsController来获取,亦或是通过insertNewObjectForEntityForName方法去新增,只要是在绑定到代理上的那个controller对象所包含的结果集内的对象有变化,都会触发代理中的didChangeObject方法。

对于对象相关的关系对象变化,比如post对象有个owner对象关系,owner发生了变化,如果会影响结果集,同样会触发post的didChangeObject方法,反之则不会。

遇到最多的问题是相关的model有了更新,并在上下文保存了,但关联的代理的didChangeObject方法中没有被触发,总结了一下,原因主要有几个:

1. managedObejctContext不一致

2. 分析下fetch到controller对应的predicate是否包含受影响的该model,并检查由于该model的相关属性变化后,它对应在结果集中是新增/更新/删除操作,那么在didChangeObject中就会触发到相应的NSFetchedResultsChange

3. 当前返回的controller的delegate是否绑定到对应的代理上了

相关资料:

https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreData/nsfetchedresultscontroller.html

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


分享题目:FetchedResultsController与CoreData-创新互联
网站地址:http://azwzsj.com/article/jhoge.html