1

我有一个当前基于 Core Data 构建的应用程序,并且有多个线程和多个 NSManagedObjectContexts。这是一个音乐应用程序,所以后台线程上总是有运行的东西,不需要干扰主线程,反之亦然。

到目前为止,我一直在慢慢解决各种死锁和线程安全问题,但坦率地说,我在试图保持 MOC 同步并让它们不阻塞线程,并且没有访问已删除的实体等方面遇到了困难.

我的问题是:如果我放弃 Core Data 并创建一些自定义 NSObjects 来跟踪属性,这会使这类问题变得更简单吗?是否可以从多个线程访问 NSObjects(不会导致死锁等),这样我就不必维护多个副本并同步它们?或者我还会面临类似的挑战吗?

我对 Objective-c 很陌生,所以我真的在寻找更简单的解决方案,而不是最复杂的解决方案。任何指向此类事物的良好设计模式的链接也值得赞赏!

4

1 回答 1

5

重新表述这个问题:“我们最好放弃一个框架,在这个框架中,工程师们只专注于创建所述框架,他们花费了无数小时在该框架的并发模型上工作,而不是从头开始推出我们自己的并发模型?”

并发很难。

滚动你自己的意味着解决 Core Data 已经解决的所有问题(包括从多个线程访问状态而不会出现死锁和/或需要许多数据副本),然后添加你的应用程序所需的任何独特的扭曲。编写 Core Data 的团队对这个主题进行了非常深入的思考,以至于有一整套专门用于它的文档(以及支持它的 API)。

因此,当然,很可能存在一个高度特定于您的应用程序的并发模型,它比使用 Core Data 更有效,但您最终将重新发明 Core Data 当前为您您提供的持久性模式'将需要从头开始设计所说的并发模型。

所以,不,没有简单的出路。

鉴于它是一个音乐应用程序,我完全可以理解并发问题的难度。延迟显然是一个大问题。您需要提出更具体的架构/设计问题才能真正收集到上述之外的更多见解。

例如,您通过 Core Data 保存的数据粒度是多少,所述数据的更改频率是多少?所述数据的模型是否相对最优?等等等等……


或者,举个具体的例子:

假设您有一个Note描述要播放的音符的类。假设该便笺具有pitch, volume, duration,instrument等属性...

现在,假设您的后台线程需要设置pitchduration.

如果没有某种线程同步,消费线程如何知道编辑线程已完成编辑?

于 2013-08-11T05:07:02.837 回答