Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/99.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 我可以在performBlock块中重复使用上下文吗?_Ios_Objective C_Core Data_Nsmanagedobjectcontext - Fatal编程技术网

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中的任何对象。