我可以在 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 中的任何内容,则可以使用后者。