【问题标题】:does this strategy that use core data with multiple thread will block main thread ?这种使用多线程核心数据的策略会阻塞主线程吗?
【发布时间】:2013-07-09 22:14:48
【问题描述】:

我已经阅读了许多推荐在多线程中使用以下模式的核心数据的博客。

但问题是,如果在应用程序启动时我必须加载大量记录,我必须使用 NSFetchdResultsController 来获取 CoreData 中的所有记录。因为它将在主线程(main moc)中运行,它会阻塞主线程吗?如果我想获取一些记录,我可以使用 Temporary Background MOC 来获取吗?以及怎么做?

【问题讨论】:

  • 如果有东西在主线程上运行,那么是的,它会阻塞 UI,但你可以从 bg 线程上的核心数据中获取结果。
  • 如何在后台线程中获取结果并通知主moc?
  • 使用 GCD 有很多关于这方面的教程,但是在使用线程和 CoreData 时必须非常小心 ManagedObjectContext。基本上每个线程都有自己的托管对象上下文,您可以在后台线程上获取/处理数据,然后将结果发布到主线程上。

标签: ios core-data


【解决方案1】:

您通常在 NSFetchedResultsController 的获取请求上配置批处理。然后,当您在 NSFetchedResultsController 中执行 fetch 并依次执行 fetch 请求时,该请求非常小,因为它基本上只获取对象 ID 而没有数据。稍后,当访问结果中的某些对象时(通常在 -tableView:cellForRowAtIndexPath:) 中,将获取第一批。此获取也需要很少的时间(如果您配置足够小的批量大小)。当您滚动并访问不在批次中的第一个对象时,将获取下一个批次,依此类推。这样就不会在主线程上执行大的获取。

这种方法和您选择的模式存在一个问题。出于某种原因,当在子上下文中执行获取请求时,批处理不起作用。它仅适用于直接连接到持久存储协调器的上下文。

【讨论】:

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