Core data 在NSO操作中创建依赖项

Core data 在NSO操作中创建依赖项,core-data,nsoperation,Core Data,Nsoperation,我有一个相当复杂的下载过程,我想在后台线程中执行。在这个过程中,各个步骤之间有一些自然的依赖关系。例如,在设置表A和表B之间的关系(我使用的是核心数据)之前,我需要完成表A和表B的下载 我首先考虑将每个依赖步骤放在自己的NSO操作中,然后在两个操作之间创建依赖关系(即,在一个操作中下载两个表,然后在下一个依赖操作中设置它们之间的关系)。但是,每个NSO操作都需要自己的NSManagedContext,因此这是不好的。在下载两个表并设置它们的关系之前,我不想保存后台上下文 因此,我得出结论,这一切

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

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

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


然而,我是一名iOS初学者,因此在我尝试这条道路之前,我不介意就我是否得出了正确的结论提出建议。

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

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

如果要使用异步API,这本质上意味着构造一个类,等待两个操作完成,然后启动另一个NSO操作或块来进行解析和关系构造

想象一下事件的顺序:

  • 用户执行一些操作(点击按钮等)
  • 该操作的选择器触发两个网络请求
  • 当两个请求都完成时(它们都通知一个公共委托),启动解析操作
  • 在代码中可能类似于以下内容:

    - (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.
       }
     }
    
    此解决方案容易出现两个主要陷阱:

  • 它将整个数据集保留在内存中,直到两个请求都完成
  • 您必须不断打开呼叫您的代表的特定请求(错误处理、成功等)

  • 基本上,您是在自己实现操作依赖关系,尽管由于NSURLConnection的结构,可能没有一个好办法来解决这个问题。

    鉴于您的验证需求,我认为在一个操作中实现操作依赖关系是最简单的,尽管这可能会在代码结构方面有点麻烦

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

    如果要使用异步API,这本质上意味着构造一个类,等待两个操作完成,然后启动另一个NSO操作或块来进行解析和关系构造

    想象一下事件的顺序:

  • 用户执行一些操作(点击按钮等)
  • 该操作的选择器触发两个网络请求
  • 当两个请求都完成时(它们都通知一个公共委托),启动解析操作
  • 在代码中可能类似于以下内容:

    - (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.
       }
     }
    
    此解决方案容易出现两个主要陷阱:

  • 它将整个数据集保留在内存中,直到两个请求都完成
  • 您必须不断打开呼叫您的代表的特定请求(错误处理、成功等)

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

    为什么不能使用多个上下文?您可以忽略其他两个上下文中的保存通知,并在您关心的上下文之后刷新。因为在设置关系之前尝试保存表A或表B会导致验证失败,即关系不是可选的。然而,你提出了一个有趣的观点。如果我能够在后台线程MOC中保存数据,而不通知主线程的MOC并触发合并,那么MOC是否仍有可能在后续回迁中提取保存的数据?我从来都不太清楚这一点,听起来你可能知道!后续的抓取将获取更改,但只有当您以前从未访问过这些对象(即,它们都是新的)时,才建议您使用现有对象,最好在MOC上使用-refreshObject:mergeChanges或-reset。啊,这很有意义。感谢您的澄清。为什么您不能使用多个上下文?您可以忽略其他两个上下文中的保存通知,并在您关心的上下文之后刷新。因为在设置关系之前尝试保存表A或表B会导致验证失败,即关系不是可选的。然而,你提出了一个有趣的观点。如果我能够在后台线程MOC中保存数据,而不通知主线程的MOC并触发合并,那么MOC是否仍有可能在后续回迁中提取保存的数据?我从来都不太清楚这一点,听起来你可能知道!后续的抓取将获取更改,但只有当您以前从未访问过这些对象(即,它们都是新的)时,才建议您使用现有对象,最好在MOC上使用-refreshObject:mergeChanges或-reset。啊,这很有意义。谢谢你的澄清。谢谢你花时间回答。有人从另一个来源建议我使用NSURLConnections的“异步”功能来获取数据,因为这将在后台发生,并且只启动NSO操作来设置关系。我想这是你在上面推荐的,但是我想