【问题标题】:CoreData and multithreading environmentCoreData 和多线程环境
【发布时间】:2015-10-05 16:37:40
【问题描述】:

我的应用程序涉及多线程,我不希望任何东西破坏核心数据

当涉及到变量时,我们可以安全地使用@Synchronized 来确保它不会损坏......但是对于整个核心数据,有什么办法可以做到这一点吗?

欢迎提出任何建议或方法

【问题讨论】:

  • Core Data Programming Guide 中的Concurrency 讨论开始。

标签: ios objective-c multithreading core-data synchronized


【解决方案1】:

不要将@synchronize 与Core Data 一起使用。你只需要遵循 Core Data 的线程规则:

  • 上下文只能用于与其关联的队列(主队列或私有队列)
  • 托管对象只能用于与其关联的上下文所属的队列(同样是主队列或私有队列)

还有我个人的规则:

  • 如果它正在提供 UI,请使用主队列上下文(最好是单个主队列上下文)
  • 数据处理属于私有队列上下文,该队列上下文是主队列上下文的子级。

遵循这些规则,您就不会遇到线程问题。

【讨论】:

  • @Macus S. Zarra 将后台上下文管理对象传输到主上下文的最佳方法是什么。如果我在后台上下文中获取大量数据,然后想将其带入主上下文。什么应该是正确的方法。
  • 如果您正在获取用于 UI 的数据,请使用 Main 上下文,不要在私有上下文中获取它。如果您正在谈论从网络加载数据,请将其加载到私有上下文中,然后您的 UI 应该使用 NSFetchedResultsController响应来保存私有子上下文。
  • S Zara 谢谢。在主线程上获取 1000 个托管对象时,它需要一些时间并且 UI 挂起。在使用您提出的核心数据堆栈时,我想在后台上下文中启动应用程序时从持久存储中获取这些对象,并希望在 UI 上显示。所以这就是为什么我想在主线程上下文中传输这些背景上下文对象。正确的方法应该是什么。
  • Core Data 不能以这种方式工作,您不会从中看到性能优势。您要做的是构建您的NSFetchRequest,以便它只提取您现在需要的对象,并检索其他对象的列表,以便它可以通过列表工作一次只有其中一些在内存中。将数千个对象提取到内存中对于内存来说是BAD。最好按照预期的方式使用该工具。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-03
  • 2011-07-27
  • 1970-01-01
  • 1970-01-01
  • 2018-05-10
  • 2012-04-07
  • 1970-01-01
相关资源
最近更新 更多