我可以在performBlock块中重用上下文吗?

时间:2015-04-02 01:24:14

标签: ios objective-c core-data nsmanagedobjectcontext

一般情况下,我们会有像这样的子/父上下文相关代码

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的块中重用上下文吗?

1 个答案:

答案 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中的任何内容,你可以使用后者。