Ios 我可以在performBlock块中重复使用上下文吗?
通常,我们会有这样的子/父上下文相关代码Ios 我可以在performBlock块中重复使用上下文吗?,ios,objective-c,core-data,nsmanagedobjectcontext,Ios,Objective C,Core Data,Nsmanagedobjectcontext,通常,我们会有这样的子/父上下文相关代码 dispatch_async(dispatch_get_main_queue(), ^{ NSManagedObjectContext *childContext = [[[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType] autorelease]; childContext.parentContext = self.m
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)
}];
}];
如果在使用success completion块调用POST方法之前没有对childContext中的任何内容进行变异,则可以使用后者。非常感谢,使用另一个performBlock重用childContext是有意义的。但我不明白你的最后一句话“但如果你计划做MOC工作……”。据我所知,即使在这种情况下,我仍然可以采用你在这里提出的方法。@ybbaigo。。使用与您类似的伪代码进行说明。这在很大程度上取决于您是否在“成功”完成块之前和内部编辑MOC中的任何对象。