Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/100.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 关于如何通过UI响应处理后台和前台核心数据的指导_Ios_Core Data - Fatal编程技术网

Ios 关于如何通过UI响应处理后台和前台核心数据的指导

Ios 关于如何通过UI响应处理后台和前台核心数据的指导,ios,core-data,Ios,Core Data,所以我在这里玩了很长时间这个“问题”,我一直在讨论问题: 这里或多或少是我想要的数据流 用户转到控制器 控制器pings FTP站点(如果向上继续) 循环遍历每个父记录 解析每条记录(这是一个缓慢的过程),将其和所有子数据转换为一个巨大的JSON结构,该结构存储在临时目录中 使用解析任务的进度向用户更新屏幕 通过FTP上传JSON结构 成功上传后,更新记录上的“IsUpload”字段 现在我讨论的所有问题都是保持UI的更新。我正在设计一个简单的UI,其中有一个状态栏,显示每个JSON文件

所以我在这里玩了很长时间这个“问题”,我一直在讨论问题:

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

  • 用户转到控制器
  • 控制器pings FTP站点(如果向上继续)
  • 循环遍历每个父记录
  • 解析每条记录(这是一个缓慢的过程),将其和所有子数据转换为一个巨大的JSON结构,该结构存储在临时目录中
    • 使用解析任务的进度向用户更新屏幕
  • 通过FTP上传JSON结构
  • 成功上传后,更新记录上的“IsUpload”字段
现在我讨论的所有问题都是保持UI的更新。我正在设计一个简单的UI,其中有一个状态栏,显示每个JSON文件解析任务的过程。我可以让事情顺利进行,但一旦我试图获得一个响应良好的用户界面,我就会遇到各种各样的问题

我知道我应该在主线程上执行CoreData,但这样做时,我的UI不会更新,并且变得没有响应

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

我把
performselectornmainthread
performselectornbackground
调用弄得一团糟

要么我按照自己喜欢的方式工作,要么我的managedObjectContext出现了某种错误,我想也许是时候进行一点重写,而不是试图挽救我所拥有的东西了


有人能告诉我一些关于我应该用什么的想法吗?我似乎无法正确理解多线程核心数据的概念,即我应该使用
NSOperationQueues
GCD还是其他方式来做事情。

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

要刮平表面,请参见

您可以通过将其初始化为“专用队列”绑定上下文来创建背景上下文(有关更多详细信息,请参阅)。

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

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

将此上下文中的更改合并到主上下文是通过在初始化后将主上下文设置为上下文的父上下文,或者注册到其“did save”通知并将更改合并到主上下文(第一种方法更容易实现)来完成的。

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

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