在文档:NSManagedObjectContext类引用中,它声明:
基于队列的托管对象上下文上的Setter方法是线程安全的.您可以在任何线程上直接调用这些方法。
有人能给出一个代码示例来说明这到底意味着什么吗。这是否意味着阅读“基于队列的托管对象上的Setter方法是线程安全的”?
另外,如果我将托管对象存储为iVar (不是最佳实践),那么可以调用它的managedObjectContext方法和its,然后在任何线程中安全地调用performBlock()吗?
发布于 2015-07-15 13:35:42
不,它的意思正是它所说的。您可以从任何线程调用NSManagedObjectContext上的setter方法。-[setParentContext:],-[setPersistentStoreCoordinator:]。
您可以从任何线程调用-[performBlock:]和-[performBlockAndWait:],因为它将在上下文的队列上执行传递的块。
发布于 2015-07-15 13:56:04
-[performBlock:]和-[performBlockAndWait:]用于应用程序,避免从错误的分派队列访问托管对象上下文或托管对象。
让我们想象一下,我使用PrivateQueueConcurrencyType将托管对象上下文设置为后台上下文,并在主线程上运行以下代码:
NSManagedObject *mo = [NSEntityDescription insertNewObjectForEntityForName:@"Address" inManagedObjectContext:backgroundContext];
mo.street = "Rue la place"
[backgroundManagedObjectContext save:&error]这段代码违反了Core的并发模型,因为它使用私有队列上下文作为主线程的参数调用-[insertNewObjectForEntityForName::]。
因此,我们应该将对backgroundContext的所有访问封装在传递给performBlock:或performBlockAndWait:的块中,该块在上下文的私有分派队列上执行该块:
[self.backgroundManagedObjectContext performBlockAndWait:^{
NSManagedObject *mo = [NSEntityDescription insertNewObjectForEntityForName:@"Address" inManagedObjectContext:backgroundContext];
mo.street = "Rue la place"
[backgroundManagedObjectContext save:&error]
}];https://stackoverflow.com/questions/31430886
复制相似问题