使用 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 正确添加附加部分?