一般情况下,我们会有像这样的子/父上下文相关代码
dispatch_async(dispatch_get_main_queue(), ^{
NSManagedObjectContext *childContext = [[[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType] autorelease];
childContext.parentContext = self.managedObjectContext;
[childContext performBlock:^{
// do something with childContext and save
}];
});
现在我需要在performBlock中使用AFHTTPRequestOperationManager发送网络请求,
dispatch_async(dispatch_get_main_queue(), ^{
NSManagedObjectContext *childContext = [[[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType] autorelease];
childContext.parentContext = self.managedObjectContext;
[childContext performBlock:^{
[RequestOperationManager POST... parameters... success...{
// Can I re-use childContext here?
}];
}];
});
我可以在performBlock的块中重用上下文吗?
答案 0 :(得分:0)
是的,您可以在嵌套在performBlock块中的完成块中重用childContext实例。它将被块保留,直到块被解除分配。
但是,您可能需要使用另一个嵌套块,因为您必须再次使用performBlock
将MOC工作分派给childContext的正确队列,因为可以将成功块分派到不同的队列。这表明您可能希望在成功完成块中嵌套childContext performBlock调用,这与您所说明的相反。但是如果有MOC工作,你计划在POST函数之后的和之前做两件事,那么你最终会得到另一个嵌套块。这真的取决于你在这里包装psuedocode的实际代码。
我正在讨论的选项,如图所示。
childContext.parentContext = self.managedObjectContext;
[childContext performBlock:^{
... update a NSManagedObject...
[RequestOperationManager POST... parameters... success...{
[childContext performBlock:^{
... update a NSManagedObject...
... (and maybe save)
}];
}];
}];
与
childContext.parentContext = self.managedObjectContext;
[RequestOperationManager POST... parameters... success...{
[childContext performBlock:^{
... update a NSManagedObject...
... (and maybe save)
}];
}];
如果你在使用成功完成块调用POST方法之前没有改变childContext中的任何内容,你可以使用后者。