【问题标题】:Core Data batch size核心数据批量大小
【发布时间】:2011-05-03 04:04:14
【问题描述】:

我是 Core Data 的新手。我正在处理一个大型数据库,因此批处理/故障机制对我来说很重要。

我了解在使用 NSFetchedResultsController 与 UITableView 配对时这是如何工作的,但如果我不使用这种配对怎么办,即如果我允许用​​户按顺序浏览详细视图控制器怎么办(类似于 Apple 的邮件程序在消息级别执行)?

现在,我将排序后的 fetch 结果加载到 NSArray 中,并可以根据需要遍历它。但是如果我将获取的结果的批量大小限制为 20,当用户想要导航到对象 #21 时我该怎么办?

【问题讨论】:

    标签: core-data


    【解决方案1】:

    虽然 NSFetchedResultsController 旨在与 UITableView 一起使用,但您仍然可以单独使用它。

    创建获取请求时,setLimit 确定返回的对象总数。 setBatchSize 确定一次有多少这些对象没有故障。因此,最初,除了前 20 个检索到的对象外,所有对象都将作为故障返回。当您访问第 21 项时,它将在结果集中获取(无故障)另外 20 个对象。

    【讨论】:

    • 我知道这是一个选项,但有人警告说,当不需要 UITableView 时,它是一种资源密集型机制。你同意这个观点,还是你觉得方便超过成本?此外,在没有表的情况下导航 FetchedResultsController 的机制是什么,即当与表配对时,滚动当前批次记录的行为可能会触发下一批故障。但是如果我直接访问 fetchedObjects 并直接开始迭代它,什么会触发下一批? MOC 不会根据需要简单地对每个对象进行故障排除吗?
    • 除了管理部分之外,获取的结果控制器会对其底层 MOC 进行更改跟踪,并且还可以实现缓存。您可以通过成为 FRC 的代表来获悉变更。它还可以缓存最后一个结果集。但是,上述批处理行为并不限于使用 FRC。
    • 首先,感谢您花这么多时间回答我的问题,但我仍然不清楚一件事。假设我有一个 ViewController,它使用 Next/Prev 按钮一次显示我的对象。如果我使用一个数组来保存我的 fetch 请求的第一批结果,我只需监视我在数组索引中的位置,如果想要超过第一批的末尾,我使用 fetchOffSet 来触发错误下一批对象。这很简单。但是,如果使用 FetchResultsController,我将如何以不同的方式管理此任务:导航和获取下一批?
    • 其实我只是做了一些额外的阅读/实验,我想我明白了。正如 Scott 在上面试图告诉我的, setBatchSize 只影响将触发错误的对象数量; setLimit 影响检索的对象数量。因此,如果我的查询返回 1,000 个对象并且我的批量大小为 20,则该数组将包含所有 1,000 个对象;只是除了前 20 个之外,它们都会出现故障。就故障触发或不触发而言,我是直接访问结果数组还是使用 NSFetchedResults 控制器没有区别;它是管理这个的 MOC。
    • 当然,这引发了另一个问题。为了使 NSFetchedResultsController 在对大型数据集进行操作时高效,它还必须在底层使用 setFetchLimit 和 setFetchOffset 机制,即限制返回的记录......这就是为什么 TechZen 说我应该在不使用时模仿这种行为NSFetchedResultsController。我总是在房间里慢。非常感谢 TechZen 和 Scott 澄清此事。
    【解决方案2】:

    您使用fetchOffSet 方法让提取请求在您已经提取的点之后开始下一次批量提取。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多