2015-04-02 29 views
0

在一般情况下,我们都会有这样的我可以在performBlock块中重新使用上下文吗?

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 
    }]; 
}); 

现在我需要与AFHTTPRequestOperationManager发送网络请求performBlock子/父上下文相关的代码,

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?

回答

0

是的,您可以在嵌套在performBlock块中的完成块中重用childContext实例。它将被块保留,直到块被释放。

但是,您可能需要使用进一步的嵌套块,因为您必须再次使用performBlock将MOC工作分派到childContext的正确队列,因为可以将成功块分派到不同的队列。这表明您可能希望在成功完成块中嵌套childContext performBlock调用,与您所示的嵌套相反。但是如果有MOC工作,你打算在POST函数之后的之前完成这两项工作,那么你将最终得到另一个嵌套块。这真的取决于你在这里包装伪代码的真实代码。

我正在讨论的选项,说明。

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任何使用后者。

+0

非常感谢你,重用childContext与另一个performBlock是有意义的。但我不明白你的最后一句话“但是如果你有MOC工作,你打算......”。据我的理解,即使在这种情况下,我仍然可以用你在这里提出的同样的方法去。 – 2015-04-02 03:25:52

+0

@ybbaigo ..用类似于你的伪代码说明。它非常取决于您是否在该“成功”完成块之前和之内编辑MOC中的任何对象。 – stevesliva 2015-04-02 03:34:37

+0

知道了,再次感谢 – 2015-04-02 04:42:54

相关问题