使用 FetchResultController 和 ManagedObjectContext 获取对象的区别

Posted

技术标签:

【中文标题】使用 FetchResultController 和 ManagedObjectContext 获取对象的区别【英文标题】:Difference between getting an Object using FetchResultController and ManagedObjectContext 【发布时间】:2010-03-30 20:36:01 【问题描述】:

使用 FetchResultController 或 ManagedObjectContext 从 Core Data 获取元素有什么区别??

1) FetchResultController

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
[fetchRequest setEntity:[NSEntityDescription entityForName:@"Item" inManagedObjectContext: managedObjectContext]]; 

NSSortDescriptor *sortDescriptorNameAscending = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptorNameAscending,nil];
[fetchRequest setSortDescriptors:sortDescriptors];
[sortDescriptorNameAscending release];

NSFetchedResultsController *frc = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:@"Lists"]; 

2) ManagedObjectContext

NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
[request setEntity:[NSEntityDescription entityForName:@"Item"  inManagedObjectContext:managedObjectContext]]; 
NSError *error = nil; 
NSArray *items = [ managedObjectContext executeFetchRequest:request error:&error]; 

【问题讨论】:

【参考方案1】:

使用NSFetchedResultsController 而不是仅仅使用NSFetchRequest 背后的意义在于监控您的数据以及使用部分时的便捷方法。

仅处理 NSFetchRequest 时,您必须自己确定部分,并且在发生变化时需要重新获取数据。

在处理NSFetchedResultsController 时,它将确定您的部分,缓存结果(对该数据进行第二次请求几乎是瞬时的),并为您的 NSTableView 提供方便的方法。最后,当您的数据发生变化时,NSFetchedResultsController 将通过其代表通知您。

这两者的内部数据将是相同的。不同之处在于管理该数据的状态。

【讨论】:

【参考方案2】:

NSFetchedResultsController 对象会告诉您查询的对象何时发生变化。只需提供一个委托对象来接收调用(参见NSFetchedResultsControllerDelegate 协议的文档)。 它还为您提供部分管理,如果您想在表格视图中显示数据,这将非常有用。

【讨论】:

谢谢。但是这两个方法返回的Array是一样的,不是吗??问题是关于它的:关于回报的差异。我询问后测试,我认为是。

以上是关于使用 FetchResultController 和 ManagedObjectContext 获取对象的区别的主要内容,如果未能解决你的问题,请参考以下文章

fetchResultController 快速获取 NSInvalidArgumentException

对 fetchResultController 如何与 MagicalRecord 一起工作感到困惑

TableView NSFetchedResultsController CoreData:错误

如何使用 Fetch Result Controller 正确添加附加部分?

nsobject 与 nsmanagedobject 的优缺点

为每个动作保存上下文