在NSOperation中创建依赖关系

时间:2011-06-19 15:46:15

标签: core-data nsoperation

我想在后台线程中执行相当复杂的下载过程。此过程中的步骤之间存在一些自然依赖关系。例如,我需要在设置它们之间的关系之前完成表A和表B的下载(我使用的是核心数据)。

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

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

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

1 个答案:

答案 0 :(得分:0)

考虑到你的验证要求,我认为在一次操作中它是最容易的,尽管就代码结构而言,这可能会变成一些毛球。

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

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

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

  1. 用户执行某些操作(按钮点击等)
  2. 该操作的选择器会触发两个网络请求
  3. 当两个请求都完成时(它们都通知公共委托)启动解析操作
  4. 可能在代码中看起来像这样:

    - (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. 您必须不断打开调用您的代理人的特定请求(用于错误处理,成功等)。
    3. 基本上,你是在自己实现操作依赖,虽然由于NSURLConnection的结构可能没有好办法。