gpt4 book ai didi

objective-c - 核心数据 : executeFetchRequest vs performFetch

转载 作者:太空狗 更新时间:2023-10-30 03:21:43 28 4
gpt4 key购买 nike

我想要一份关于两者比较的完整 list 。我知道的事情:

执行FetchRequest:

  • 消息已发送至 MOC
  • 返回一个托管对象数组
  • 目标:从持久存储中获取对象到 MOC
  • With table view:与table view无关
  • 频率:经常在循环中使用,所以可以调用很多次

performFetch:

  • 消息已发送至 FRC
  • 调用后,使用fetchedObjects返回一个托管对象数组
  • 使用 TableView :FRC 专门用于使托管对象和 TableView 行保持同步,并使用 performFetch 来初始化该过程。
  • 频率:通常只有一次。除非 FRC 的 fetch 请求发生变化,否则无需再次调用 performFetch

如果我错了请纠正我并附上列表。谢谢。

最佳答案

关于 executeFetchRequest:

Message sent to MOC

Return an array of managed objects

是的,但您也可以更改要检索的结果类型。在 NSFetchRequest 中,您可以设置不同的结果类型:

- (void)setResultType:(NSFetchRequestResultType)type

NSFetchRequestResultType 可以是不同的类型。摘自 Apple 文档:

enum {
NSManagedObjectResultType = 0x00,
NSManagedObjectIDResultType = 0x01,
NSDictionaryResultType = 0x02
NSCountResultType = 0x04
};
typedef NSUInteger NSFetchRequestResultType;

Goal: fetch objects from persistent store to MOC

是的,创建一个 NSFetchRequest 并执行请求,这与在 SQL 中创建一个 SELECT 语句相同。如果您还使用 NSPredicate,则与使用 SELECT-WHERE 语句相同。

With table view: has nothing to do with table view

是的,但是您可以使用检索到的数据填充表格

Frequency: often used in a loop, so could be called many many times

这取决于您想要实现的目标。它可能在一个循环内,也可能不在循环内。在一个循环中执行请求可能会对性能产生影响,但我不会为此担心。在底层,Core Data 维护着一种缓存机制。每次执行请求时,如果数据不在缓存中,Core Data 会在你的存储(例如 sql 文件)上执行一次往返,并用它检索到的对象填充缓存。如果执行相同的查询,由于缓存机制,不会再次执行往返。无论如何,您可以避免在运行循环内执行请求,只需将该请求移出循环即可。

关于performFetch:

Message sent to FRC

After calling it, use fetchedObjects to return an array of managed objects

是的,但如果您要填充表格中的特定单元格,您也可以使用 [_fetchedResultsController objectAtIndexPath:indexPath]; 检索对象。

在这里,我真的建议阅读关于 NSFetchedResultsController 的精彩教程。

With table view: FRC is specifically for keeping managed objects and table view rows in sync, and use performFetch to initialize that process.

是的,NSFetchedResultsController 可以与 NSManagedObjectContext 结合使用。此外,它还支持延迟加载数据。假设您有 1000 个要检索的元素,并且您希望将它们显示在 UITableView 中。为 NSFetchRequest 设置请求,例如:

[fetchRequest setFetchBatchSize:20];

并将它与 NSFetchedResultsController 的实例一起使用,它允许首先加载 20 个元素。然后,当您滚动时,会加载其他 20 个元素,依此类推。如果没有 NSFetchedResultsController,您必须手动实现此行为。请参阅我提供的教程以获取更多信息。

Frequency: often only once. Unless fetch request of FRC changes, no need to call performFetch a second time

这取决于你想达到什么目的。大多数情况下,您可以调用一次。

希望对您有所帮助。

编辑

您必须显式调用 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]);
}

关于objective-c - 核心数据 : executeFetchRequest vs performFetch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12645641/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com