所以我一直在玩这个"问题"在这里很长一段时间我一直在讨论问题:
这或多或少是我想要的数据流
现在我处理各种问题的方法是更新UI。我设计了一个简单的UI,我们有一个状态栏,显示每个JSON文件解析任务的过程。我可以让事情有效,但一旦我做到了。尝试获得一个很好的响应UI我遇到了各种各样的问题。
我理解我应该在主线程上执行CoreData,但是,这样做我的UI不会更新并且没有响应。
我将NSManagedObjectContext
转移到此控制器上,我从该objectContext中了解到,我可能会引用NSPersistantStoreCoordiantor
并为第二个威胁创建第二个NSManagedObjectContext
,并且我可能会以某种方式同步这些线程。
我在整个地方performSelectorOnMainThread
和performSelectorInBackground
来电等事情搞得一团糟等。
要么我按照我喜欢的方式工作,要么我在使用托管对象语言时遇到某种错误,我想是时候稍微改写一下而不是试图挽救什么我有。
有人能指出我应该使用的一些想法吗?对于我是否应该使用NSOperationQueues
GCD或其他一些做事方式,我似乎无法正确地围绕多线程核心数据概念进行正确包围。
答案 0 :(得分:0)
只要将托管对象和上下文绑定到正确的线程/队列,CoreData就能够在多线程环境中运行。
要刮擦表面,请参阅HERE
您可以通过将其初始化为"私人队列来创建背景上下文"绑定上下文(有关详细信息,请参阅HERE)。
基本上,这意味着为了正确使用此上下文,您必须执行包含在上下文performBlock:
或performBlockAndWait:
方法中的代码。
你可以使用这些方法排队"任务"执行上下文(串行执行队列)
此代码将在后台执行。
您还可以创建一个仅限于特定线程(NSConfinementConcurrencyType
)的上下文,然后只在创建它的线程中访问它而不使用"执行块"方法。
将此上下文中的更改合并到主上下文中,方法是在初始化后将主上下文设置为上下文的父级,或者通过注册到"确实保存"通知并将更改合并到主要上下文(第一种方法更容易实现)。
您流程的一个解决方案是:
performBlockAndWait:
保存私有上下文和主上下文(只是为了保持操作一致)如果有许多更新,这仍将影响您的主线程,因为所有保存都将通过主要上下文 尝试对保存进行分段,以避免长时间锁定主要上下文。