有关如何使用UI响应处理背景和前景核心数据的指南

时间:2014-04-09 15:27:56

标签: ios core-data

所以我一直在玩这个"问题"在这里很长一段时间我一直在讨论问题:

这或多或少是我想要的数据流

  • 用户定位到控制器
  • 控制器ping FTP站点(如果继续)
  • 遍历每个父记录
  • 解析每条记录(这是一个缓慢的过程)将它和所有子数据转换为一个存储在临时目录中的巨型JSON结构
    • 使用解析任务的进度将屏幕更新为用户
  • 通过FTP上传JSON结构
  • 成功上传后,更新" isUploaded"记录上的字段

现在我处理各种问题的方法是更新UI。我设计了一个简单的UI,我们有一个状态栏,显示每个JSON文件解析任务的过程。我可以让事情有效,但一旦我做到了。尝试获得一个很好的响应UI我遇到了各种各样的问题。

我理解我应该在主线程上执行CoreData,但是,这样做我的UI不会更新并且没有响应。

我将NSManagedObjectContext转移到此控制器上,我从该objectContext中了解到,我可能会引用NSPersistantStoreCoordiantor并为第二个威胁创建第二个NSManagedObjectContext,并且我可能会以某种方式同步这些线程。

我在整个地方performSelectorOnMainThreadperformSelectorInBackground来电等事情搞得一团糟等。

要么我按照我喜欢的方式工作,要么我在使用托管对象语言时遇到某种错误,我想是时候稍微改写一下而不是试图挽救什么我有。

有人能指出我应该使用的一些想法吗?对于我是否应该使用NSOperationQueues GCD或其他一些做事方式,我似乎无法正确地围绕多线程核心数据概念进行正确包围。

1 个答案:

答案 0 :(得分:0)

只要将托管对象和上下文绑定到正确的线程/队列,CoreData就能够在多线程环境中运行。

要刮擦表面,请参阅HERE

您可以通过将其初始化为"私人队列来创建背景上下文"绑定上下文(有关详细信息,请参阅HERE)。

基本上,这意味着为了正确使用此上下文,您必须执行包含在上下文performBlock:performBlockAndWait:方法中的代码。
你可以使用这些方法排队"任务"执行上下文(串行执行队列) 此代码将在后台执行。

您还可以创建一个仅限于特定线程(NSConfinementConcurrencyType)的上下文,然后只在创建它的线程中访问它而不使用"执行块"方法。

将此上下文中的更改合并到主上下文中,方法是在初始化后将主上下文设置为上下文的父级,或者通过注册到"确实保存"通知并将更改合并到主要上下文(第一种方法更容易实现)。

您流程的一个解决方案是:

  1. 创建主队列上下文(将传递给所有视图控制器)
  2. 创建操作队列
  3. 观察视图中的状态实体(在主要上下文中获取)(直接或使用FRC
  4. 每个操作都会创建一个"私有队列"上下文,主要上下文为父
  5. 当准备好提交更新(包括状态更新)时,使用performBlockAndWait:保存私有上下文和主上下文(只是为了保持操作一致)
  6. 如果有许多更新,这仍将影响您的主线程,因为所有保存都将通过主要上下文 尝试对保存进行分段,以避免长时间锁定主要上下文。