Core data 在NSO操作中创建依赖项
我有一个相当复杂的下载过程,我想在后台线程中执行。在这个过程中,各个步骤之间有一些自然的依赖关系。例如,在设置表A和表B之间的关系(我使用的是核心数据)之前,我需要完成表A和表B的下载 我首先考虑将每个依赖步骤放在自己的NSO操作中,然后在两个操作之间创建依赖关系(即,在一个操作中下载两个表,然后在下一个依赖操作中设置它们之间的关系)。但是,每个NSO操作都需要自己的NSManagedContext,因此这是不好的。在下载两个表并设置它们的关系之前,我不想保存后台上下文 因此,我得出结论,这一切都应该发生在一个NSO操作中,并且我应该在满足运行依赖方法的所有条件时,使用通知或其他机制来调用该依赖方法Core data 在NSO操作中创建依赖项,core-data,nsoperation,Core Data,Nsoperation,我有一个相当复杂的下载过程,我想在后台线程中执行。在这个过程中,各个步骤之间有一些自然的依赖关系。例如,在设置表A和表B之间的关系(我使用的是核心数据)之前,我需要完成表A和表B的下载 我首先考虑将每个依赖步骤放在自己的NSO操作中,然后在两个操作之间创建依赖关系(即,在一个操作中下载两个表,然后在下一个依赖操作中设置它们之间的关系)。但是,每个NSO操作都需要自己的NSManagedContext,因此这是不好的。在下载两个表并设置它们的关系之前,我不想保存后台上下文 因此,我得出结论,这一切
然而,我是一名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操作来设置关系。我想这是你在上面推荐的,但是我想