About executeFetchRequest:
消息已发送至 MOC
Yes
返回托管对象的数组
是的,但您也可以更改要检索的结果的类型。在NSFetchRequest
您可以使用以下方法设置不同的结果类型:
- (void)setResultType:(NSFetchRequestResultType)type
where NSFetchRequestResultType
可以有不同的类型。摘自苹果文档:
enum {
NSManagedObjectResultType = 0x00,
NSManagedObjectIDResultType = 0x01,
NSDictionaryResultType = 0x02
NSCountResultType = 0x04
};
typedef NSUInteger NSFetchRequestResultType;
目标:从持久存储中获取对象到 MOC
是的,创建一个NSFetchRequest
并执行请求,这与在 SQL 中创建 SELECT 语句相同。如果您还使用NSPredicate
它与使用 SELECT-WHERE 语句相同。
With table view:与表视图无关
是的,但是您可以使用检索到的数据填充表格
频率:经常在循环中使用,因此可以被调用很多次
这取决于您想要实现的目标。它可以在循环内,也可以不在循环内。在循环内执行请求可能会对性能产生影响,但我不会担心这一点。 Core Data 在底层维护着一种缓存机制。每次执行请求时,如果数据不在缓存中,Core Data 会在您的存储(例如 sql 文件)上执行往返,并用它检索到的对象填充缓存。如果执行相同的查询,由于缓存机制,不会再次执行往返。无论如何,您可以避免在运行循环内执行请求,只需将该请求移到循环之外即可。
About performFetch:
消息已发送至 FRC
Yes
调用后,使用 fetchedObjects 返回托管数组
物体
是的,但您也可以使用以下方法检索对象[_fetchedResultsController objectAtIndexPath:indexPath];
如果您要填充表格中的特定单元格。
在这里我真的建议阅读一个很好的教程NSFetchedResultController http://www.raywenderlich.com/999/core-data-tutorial-how-to-use-nsfetchedresultscontroller
带表视图:FRC专门用于保存管理对象和
表视图行同步,并使用 PerformFetch 对其进行初始化
过程。
Yes, a NSFetchedResultsController
与一个结合使用NSManagedObjectContext
为你。此外,它还支持延迟加载数据。假设您检索了 1000 个元素,并且希望将它们显示在UITableView
。设置请求NSFetchRequest
like:
[fetchRequest setFetchBatchSize:20];
并将其与 a 的实例一起使用NSFetchedResultsController
,它允许首先加载20个元素。然后,当您滚动时,会加载其他 20 个元素,依此类推。没有NSFetchedResultsController
您必须手动实现此行为。请参阅我提供的教程以获取更多信息。
频率:通常只有一次。除非 FRC 的 fetch 请求发生变化,否则不会
需要再次调用performFetch
这取决于您想要实现的目标。大多数时候你可以调用它一次。
希望有帮助。
Edit
你必须打电话performFetch
明确地。我喜欢为以下对象创建一个属性NSFetchedResultsController
在我的头文件(.h)中,例如
@property (nonatomic, strong, readonly) NSFetchedResultsController* fetchedResultsController;
并将其合成到您的实现文件(.m)中,例如
@synthesize fetchedResultsController = _fetchedResultsController;
然后始终在 .m 文件中覆盖 getter 以创建它的新实例:
- (NSFetchedResultsController*)fetchedResultsController
{
// it already exists, so return it
if(_fetchedResultsController) return _fetchedResultsController;
// else create it and return
_fetchedResultsController = // alloc-init here with complete setup
return _fetchedResultsController;
}
完成后,在您的班级中(例如在viewDidLoad
方法)使用它就像
NSError *error = nil;
if (![[self fetchedResultsController] performFetch:&error]) {
// Handle the error appropriately.
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
}