我有一个当前构建在Core Data上的应用程序,并且有多个线程和多个NSManagedObjectContexts。它是一个音乐应用程序,因此总是在后台线程上运行的东西不需要干扰主线程,反之亦然。
到目前为止,我一直在慢慢地解决各种各样的僵局。线程安全问题,但坦率地说,我试图保持MOC同步并让它们不阻塞线程,并且没有任何访问实体已被删除等等。
我的问题是: 如果我放弃Core Data并且只是创建一些自定义的NSObject来跟踪属性会使这些问题变得更简单吗?是否可以从多个线程访问NSObject(不会导致死锁等),这样我就不必维护多个副本并同步它们了?或者我还会面临类似的挑战吗?
我对Objective-c很新,所以我真的在寻找更简单的解决方案,而不是最复杂的解决方案。任何与这种东西的良好设计模式的链接也赞赏!
答案 0 :(得分:5)
重新提出这个问题:“我们最好放弃一个框架,其中工程师,他们唯一的重点是创建所述框架,花费了无数个小时来处理该框架的并发模型,而不是推出我们自己的并发模型,从头开始?“
并发很难。
滚动自己意味着解决Core Data已经解决的所有问题(包括从多个线程访问状态而不会死锁和/或需要许多数据副本)然后添加任何独特的曲折你需要你的应用程序。编写Core Data的团队已经深入思考了这个主题,以至于有一整套documentation devoted to it(使用API来支持它)。
所以,当然,很可能并发模型对您的应用程序非常具体,比使用Core Data更有效,但您最终会重新发明Core Data目前提供的持久性模式你和你需要从头开始设计所说的并发模型。
所以,不,没有简单的出路。
鉴于它是一个音乐应用程序,我完全可以理解并发问题的难度。延迟显然是一个巨大的问题。您需要提出一个更具体的架构/设计问题才能真正收集到超出上述内容的更多洞察力。
例如,您通过Core Data持续存储的数据粒度以及所述数据的更改频率是多少?所述数据的模型是否相对最优? Etc.etcetc ...
或者,具体的例子:
假设你有一个Note
课程来描述要播放的音符。假设该笔记包含pitch
,volume
,duration
,instrument
等属性...
现在,假设您的后台线程需要设置pitch
和duration
。
如果没有某种类型的线程同步,消费线程将如何知道编辑线程是否已完成编辑?