关于executeFetchRequest:
消息发送到 MOC
是的
返回一个托管对象数组
可以,但您也可以更改要检索的结果类型。在NSFetchRequest 中,您可以设置不同的结果类型:
- (void)setResultType:(NSFetchRequestResultType)type
其中NSFetchRequestResultType 可以是不同的类型。摘自 Apple 文档:
enum {
NSManagedObjectResultType = 0x00,
NSManagedObjectIDResultType = 0x01,
NSDictionaryResultType = 0x02
NSCountResultType = 0x04
};
typedef NSUInteger NSFetchRequestResultType;
目标:从持久存储中获取对象到 MOC
是的,创建NSFetchRequest 并执行请求,这与在 SQL 中创建 SELECT 语句相同。如果您还使用NSPredicate,则与使用 SELECT-WHERE 语句相同。
与表格视图:与表格视图无关
是的,但是您可以使用检索到的数据填充表格
频率:经常循环使用,所以可以多次调用
这取决于您想要实现的目标。它可能在一个循环内,也可能不在一个循环内。在循环中执行请求可能会影响性能,但我不会担心。在引擎盖下,Core Data 维护着一种缓存机制。每次执行请求时,如果数据不在缓存中,Core Data 会在您的存储(例如 sql 文件)上执行一次往返,并使用它检索到的对象填充缓存。如果执行相同的查询,由于缓存机制,往返不会再次执行。无论如何,您可以避免在运行循环中执行请求,只需将该请求移出循环即可。
关于performFetch:
消息发送到 FRC
是的
调用后,使用fetchedObjects返回一个托管数组
对象
是的,但是如果您要填充表格中的特定单元格,您也可以使用 [_fetchedResultsController objectAtIndexPath:indexPath]; 检索对象。
在这里我真的建议阅读NSFetchedResultsController上的一个很好的教程
使用表格视图:FRC 专门用于保存托管对象和
表视图行同步,并使用 performFetch 初始化
过程。
是的,NSFetchedResultsController 可以与 NSManagedObjectContext 结合使用。此外,它还支持延迟加载数据。假设您有 1000 个要检索的元素,并且您希望将它们显示在 UITableView 中。设置NSFetchRequest 的请求,例如:
[fetchRequest setFetchBatchSize:20];
将它与NSFetchedResultsController 的实例一起使用,它首先允许加载20 个元素。然后当您滚动时,会加载其他 20 个元素,依此类推。如果没有NSFetchedResultsController,您必须手动实现此行为。请参阅我提供的教程以获取更多信息。
频率:通常只有一次。除非 FRC 的 fetch 请求发生变化,否则不会
需要第二次调用 performFetch
这取决于您想要达到的目标。大多数时候你可以调用一次。
希望对您有所帮助。
编辑
您必须明确调用performFetch。我喜欢在我的头文件 (.h) 中为 NSFetchedResultsController 创建一个属性,例如
@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]);
}