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

Mar*_*ler 1 multithreading core-data objective-c

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

到目前为止,我一直在慢慢地解决所有类型的死锁和线程安全问题,但坦率地说,我试图保持MOC同步并让它们不阻塞线程,没有任何访问实体已被删除等等. .

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

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

bbu*_*bum 5

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

并发很难.

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

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

所以,不,没有简单的方法.

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

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


或者,举一个具体的例子:

假设您有一个Note描述要播放的音符的课程.再说说音符都有类似的属性pitch,volume,duration,instrument,等...

现在,想象你的后台线程需要设置pitchduration.

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