gpt4 book ai didi

multithreading - 在多个线程上读/写自定义对象

转载 作者:行者123 更新时间:2023-11-28 11:11:29 25 4
gpt4 key购买 nike

我需要能够从 Core Data 中获取对象并将它们保存在内存中的可变数组中,以避免持续获取和缓慢的 UI/UX。问题是我在其他线程上抓取对象。我有时也会在其他线程上写入这些对象。因此,我不能只将 NSManagedObjects 保存在一个数组中,然后调用类似 myManagedObjectContext.performBlockmyObject.managedObjectContext.PerformBlock 的东西,因为您不应该在线程之间传递 MOC。

我正在考虑使用自定义对象将我需要的数据从 CD 对象中放入。这感觉有点愚蠢,因为我已经为实体创建了一个 Model/NSManagedObject 类,并且由于自定义对象是可变的,它仍然不是线程安全的。这意味着我必须为多个线程上的对象操作做一些类似串行队列的事情?因此,例如,任何时候我想读/写/删除一个对象时,我都必须将它扔到我的对象 serialQueue 中。

这一切看起来真的很讨厌,所以我想知道是否有针对此问题或类似问题的通用设计模式?有更好的方法吗?

最佳答案

我怀疑您是否需要在 Core Data 和您的 UI 之间自定义对象。有一个更好的答案:

  1. 您的 UI 应该从与主线程关联的托管对象中读取(听起来您正在这样做)。
  2. 当您在另一个线程上进行更改时,这些更改将更新主线程上的对象。这就是 Core Data 的设计目的。
  3. 您只需要听取这些更改并让您的 UI 对其使用react。

有几种方法可以做到这一点:

  • NSFetchedResultsController。有点像你的可变数组,但有一个委托(delegate),它会在对象发生变化时发出通知。强烈推荐
  • 监听您在 UI 中显示的属性的 KVO 更改。每当属性更改时,您都会收到 KVO 通知并可以对其使用react。更多代码,但重点也更窄。
  • 通过 NSNotification 中心监听 NSManagedObjectContextDidSaveNotification 事件并对通知使用react。正在更改的对象将在通知的 userInfo 中。

在这三者中,使用 NSFetchedResultsController 通常是正确的答案。当它到位时,您只需更改其他线程上需要更改的内容,保存上下文即可完成。 UI 将自行更新。

关于multithreading - 在多个线程上读/写自定义对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34755794/

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