核心数据:executeFetchRequest 与 PerformFetch

2024-04-23

我想要一份关于两者之间比较的完整列表。我所知道的事情:

executeFetchRequest:

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

performFetch:

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

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


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]);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

核心数据:executeFetchRequest 与 PerformFetch 的相关文章

随机推荐

  • RoutingError 未初始化常量

    我想在我的应用程序中使用 token authenticatable 使用 Devise Using this https stackoverflow com questions 4627703 using devise tokens to
  • 在 I/O 中使用 char16_t 和 char32_t

    C 11介绍char16 t and char32 t以便于处理 UTF 16 和 UTF 32 编码的文本字符串 但是
  • 这在 imacros javascript 中可能吗?尝试了很多方法都没有成功

    我已经处理了所有事情 但不幸的是它返回了 未定义 的数据 我尝试了许多不同的方法来从该网站获取数据 不成功 我在其他论坛上发布了这个问题 没有人能够解决这个问题来处理完整的数据提取 我需要像这样保存数据 91 228 53 28 8089
  • VS Code 刷新集成终端环境变量,无需重新启动/注销

    如果您在 Windows 上添加 更改某些环境变量 例如 PATH 即使重新启动 VS Code 后 它也不会在 VS Code 集成终端中可用 但是 如果您从 Windows 命令提示符 Powershell 打开该终端 它将具有这些新的
  • 获取设备屏幕分辨率

    我使用以下方法来获取屏幕尺寸 public static Point getScreenSize Context context WindowManager wm WindowManager context getSystemService
  • Laravel 5 Blade 在出现错误时显示空白页而不是抛出异常

    在 laravel 4 中 当你尝试渲染一个不存在的视图时应用程序 视图或者带有未定义变量的视图 laravel 将抛出异常或显示有助于调试的错误 我全新安装了 laravel 5 0 13 并且在对刀片模板进行故障排除时遇到了困难 该模板
  • useCallBack 和 useEffect 无限循环

    根据下面的代码 我需要在任何时候调用一个函数inView是真的 但是使用 useEffect and useCallback列出依赖项 我会导致无限循环 我设法避免它的唯一方法是不列出依赖项 但我收到一条警告 要求我列出它们 我只尝试过us
  • RGB 值作为变量

    如何在 rgb 中存储变量值 我使用这个不起作用的代码 我希望它是这样的 但不知怎的 它没有正确存储 R 将引号放在 200 左右 否则 R 也不起作用 我假设你正在使用 JavaScript 结果在 colval rgb 200 10 1
  • 运行“应用程序时出错:未找到目标设备”。 Android Studio 3.6 预览版

    初学者 无法在 Android Studio 3 6 上运行我的第一个 Android 应用程序 如何进行正确的设置才能在模拟器中查看预览设备 I tried the same question and discussion but fai
  • USR1 信号后可靠地终止睡眠进程

    我正在编写一个 shell 脚本 它定期执行任务并从另一个进程接收 USR1 信号 该脚本的结构类似于这个答案 https stackoverflow com a 27694965 1402511 bin bash trap echo do
  • Pygame 中按钮内的进度条

    期望的行为是 当用户将鼠标放在按钮上时 会出现深灰色进度条并开始以恒定的速度递增 我希望能够确定它完全充满需要多长时间 比如 2 秒 如果在进度条达到 100 之前鼠标移出按钮 进度条应直接变为 0 如果条达到 100 程序应在终端中打印一
  • 将重定向运算符与 Java Runtime Exec 一起使用

    我有这个字符串 在 Windows XP 的 JVM 中与 Runtime exec 一起使用 String cmd encoderFull i originalFull bitrate bitrateVBR i bvhq avi outp
  • 将全屏宽度和高度部分分为 3 行

    我有一个完整的宽度和高度部分 html 主页 我怎样才能将这个部分分成 3 行 div 每个 div 都是全宽并具有响应式背景图像 请建议我如何使用 css 和响应式页面来做到这一点 下面是解决方案 对于背景 2 在 css 代码或媒体查询
  • 在 Objective-c 问题中访问委托静态方法

    我在 Objective c 中遇到了一个奇怪的问题 这是代码 STViewController h import
  • 当鼠标在屏幕上移动时,角色仅保持移动?

    我的 while 循环仅在光标在屏幕内移动时维持精灵的移动 我尝试重新组织一些 screen blits 和 display update 和 display flip 我似乎无法弄清楚为什么角色在一个像素发生变化后停止 而不是像我预期的那
  • Java中如何进行方法链? o.m1().m2().m3().m4()

    我在许多 Java 代码符号中看到 在一个方法之后我们调用另一个方法 下面是一个例子 Toast makeText text setGravity Gravity TOP 0 0 setView layout show 调用后如您所见mak
  • TextKit:Xcode 中的编辑器占位符功能是如何实现的?

    我深入研究了 TextKit 想知道编辑器占位符是如何在 Xcode 代码编辑器中实现的 您也可以自己尝试一下并输入以下内容 lt Hello gt 它会自动变成占位符 Xcode 编辑器是使用 TextKit 构建的 经过一番研究 我想出
  • Android 中转义多个“%”字符

    在 我有这个野兽般的条目 归结为合理的最小值以重现效果
  • 通过 AWS API Gateway 上传的 PDF 已损坏

    我正在尝试使用已部署到 AWS API 网关的 C Web API 通过 Web 表单将 PDF 上传到 S3 存储桶中 这是我的代码 private static IAmazonS3 s3Client public static asyn
  • 核心数据:executeFetchRequest 与 PerformFetch

    我想要一份关于两者之间比较的完整列表 我所知道的事情 executeFetchRequest 消息已发送至 MOC 返回托管对象的数组 目标 从持久存储中获取对象到 MOC With table view 与表视图无关 频率 经常在循环中使