我可以在 performBlock 块中重复使用上下文吗?
Can I re-use the context in a block of performBlock?
一般来说,我们会有这样的child/parent上下文相关代码
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 的块中重新使用上下文吗?
是的,您可以在嵌套在 performBlock 块中的完成块中重用 childContext 实例。它将由块保留,直到块被释放。
但是您可能需要使用进一步的嵌套块,因为您必须再次使用 performBlock
将 MOC 工作分派到 childContext 的正确队列,因为成功块可以分派到不同的队列队列。这表明您可能希望将 childContext performBlock 调用嵌套在成功完成块中,这与您所说明的嵌套相反。但是,如果您计划在 之前和 之后的 POST 函数之间执行 MOC 工作,那么您将得到另一个嵌套块。这实际上取决于您在此处围绕伪代码包装的真实代码。
我正在讨论的选项,如图所示。
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 中的任何内容,则可以使用后者。
一般来说,我们会有这样的child/parent上下文相关代码
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 的块中重新使用上下文吗?
是的,您可以在嵌套在 performBlock 块中的完成块中重用 childContext 实例。它将由块保留,直到块被释放。
但是您可能需要使用进一步的嵌套块,因为您必须再次使用 performBlock
将 MOC 工作分派到 childContext 的正确队列,因为成功块可以分派到不同的队列队列。这表明您可能希望将 childContext performBlock 调用嵌套在成功完成块中,这与您所说明的嵌套相反。但是,如果您计划在 之前和 之后的 POST 函数之间执行 MOC 工作,那么您将得到另一个嵌套块。这实际上取决于您在此处围绕伪代码包装的真实代码。
我正在讨论的选项,如图所示。
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 中的任何内容,则可以使用后者。