【问题标题】:Creating Dependencies Within An NSOperation在 NSOperation 中创建依赖项
【发布时间】:2011-06-19 15:46:14
【问题描述】:

我想在后台线程中执行一个相当复杂的下载过程。此过程中的步骤之间存在一些自然的依赖关系。比如我需要先完成表A和表B的下载,然后再设置它们之间的关系(我用的是Core Data)。

我首先想到将每个依赖步骤放在它自己的 NSOperation 中,然后在两个操作之间创建依赖关系(即在一个操作中下载两个表,然后在下一个依赖操作中设置它们之间的关系)。但是,每个 NSOperation 都需要它自己的 NSManagedContext,所以这不好。在下载两个表并设置它们的关系之前,我不想保存背景上下文。

因此,我得出结论,这一切都应该发生在一个 NSOperation 中,并且我应该在满足运行它的所有条件时使用通知或其他一些机制来调用依赖方法。

不过,我是一名 iOS 初学者,所以在我冒险走这条路之前,我不介意我是否得出了正确的结论。

【问题讨论】:

  • 为什么不能使用多个上下文?您可以简单地忽略来自其他两个上下文的保存通知,并在您关心的那个之后刷新。
  • 因为在设置关系之前尝试保存表 A 或表 B 将导致验证失败 - 即关系不是可选的。但是,您提出了一个有趣的观点。如果我能够在不通知主线程的 MOC 并触发合并的情况下将数据保存在后台线程 MOC 中,那么 MOC 是否仍有可能在后续提取中获取保存的数据?我从来都不是很清楚,听起来你可能知道!
  • 后续提取将获取更改,但仅当您以前从未访问过任何这些对象(即它们都是新的)时才建议这样做,对于现有对象,最好使用 -refreshObject: MOC 上的 mergeChanges 或 -reset。
  • 啊,有道理。感谢您的澄清。

标签: core-data nsoperation


【解决方案1】:

考虑到您的验证要求,我认为这在一个操作中是最简单的,尽管就代码结构而言,这可能会变成一个毛球。

实际上,您需要进行两次线取以获取所需的整个数据集,然后将数据组合并一次性将其解析为 Core Data。

如果您要使用异步 API,这实质上意味着构建一个等待两个操作完成然后启动另一个 NSOperation 或块来执行解析和关系构建的类。

想象一下这样的事件顺序:

  1. 用户执行一些操作(点击按钮等)
  2. 该操作的选择器会触发两个网络请求
  3. 当两个请求都完成时(它们都通知一个共同的委托)启动解析操作

在代码中可能看起来像这样:

- (IBAction)someAction:(id)sender {
    //fire both network requests
    request1.delegate = aDelegate;
    request2.delegate = aDelegate;
 }

 //later, inside the implementation of aDelegate
 - (void)requestDidComplete... {
   if (request1Finished && request2Finished) {
       NSOperation *parse = //init with fetched data
       //launch on queue etc.
   }
 }

此解决方案容易出现两个主要缺陷:

  1. 它将整个数据集保存在内存中,直到两个请求都完成
  2. 您必须不断打开调用委托的特定请求(用于错误处理、成功等)

基本上,您是在自己实现操作依赖项,尽管由于 NSURLConnection 的结构可能没有很好的解决方法。

【讨论】:

  • 感谢您抽出宝贵时间回答。另一个来源向我建议我使用 NSURLConnections 的“异步”功能来获取数据,因为无论如何这都会在后台发生,并且只启动 NSOperation 来设置关系。我认为这是您在上面推荐的,但想确认一下。如果是这种情况,我相信您已经获得了绿色复选标记!
  • 哈哈,让我修改我的答案以考虑到这一点,您肯定会为您完成工作。
猜你喜欢
  • 2015-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-15
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
相关资源
最近更新 更多