最好不要使用Core Data来简化线程安全吗?

时间:2013-08-11 03:48:33

标签: objective-c multithreading core-data

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

到目前为止,我一直在慢慢地解决各种各样的僵局。线程安全问题,但坦率地说,我试图保持MOC同步并让它们不阻塞线程,并且没有任何访问实体已被删除等等。

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

我对Objective-c很新,所以我真的在寻找更简单的解决方案,而不是最复杂的解决方案。任何与这种东西的良好设计模式的链接也赞赏!

1 个答案:

答案 0 :(得分:5)

重新提出这个问题:“我们最好放弃一个框架,其中工程师,他们唯一的重点是创建所述框架,花费了无数个小时来处理该框架的并发模型,而不是推出我们自己的并发模型,从头开始?“

并发很难。

滚动自己意味着解决Core Data已经解决的所有问题(包括从多个线程访问状态而不会死锁和/或需要许多数据副本)然后添加任何独特的曲折你需要你的应用程序。编写Core Data的团队已经深入思考了这个主题,以至于有一整套documentation devoted to it(使用API​​来支持它)。

所以,当然,很可能并发模型对您的应用程序非常具体,比使用Core Data更有效,但您最终会重新发明Core Data目前提供的持久性模式你你需要从头开始设计所说的并发模型。

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

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

例如,您通过Core Data持续存储的数据粒度以及所述数据的更改频率是多少?所述数据的模型是否相对最优? Etc.etcetc ...


或者,具体的例子:

假设你有一个Note课程来描述要播放的音符。假设该笔记包含pitchvolumedurationinstrument等属性...

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

如果没有某种类型的线程同步,消费线程将如何知道编辑线程是否已完成编辑?