首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSManagedObjectContext并发

NSManagedObjectContext并发
EN

Stack Overflow用户
提问于 2015-07-15 12:49:32
回答 2查看 382关注 0票数 2

在文档:NSManagedObjectContext类引用中,它声明:

基于队列的托管对象上下文上的Setter方法是线程安全的.您可以在任何线程上直接调用这些方法。

有人能给出一个代码示例来说明这到底意味着什么吗。这是否意味着阅读“基于队列的托管对象上的Setter方法是线程安全的”?

另外,如果我将托管对象存储为iVar (不是最佳实践),那么可以调用它的managedObjectContext方法和its,然后在任何线程中安全地调用performBlock()吗?

EN

回答 2

Stack Overflow用户

发布于 2015-07-15 13:35:42

不,它的意思正是它所说的。您可以从任何线程调用NSManagedObjectContext上的setter方法。-[setParentContext:]-[setPersistentStoreCoordinator:]

您可以从任何线程调用-[performBlock:]-[performBlockAndWait:],因为它将在上下文的队列上执行传递的块。

票数 2
EN

Stack Overflow用户

发布于 2015-07-15 13:56:04

-[performBlock:]-[performBlockAndWait:]用于应用程序,避免从错误的分派队列访问托管对象上下文或托管对象。

让我们想象一下,我使用PrivateQueueConcurrencyType将托管对象上下文设置为后台上下文,并在主线程上运行以下代码:

代码语言:javascript
复制
NSManagedObject *mo = [NSEntityDescription insertNewObjectForEntityForName:@"Address" inManagedObjectContext:backgroundContext];
mo.street = "Rue la place"
[backgroundManagedObjectContext save:&error]

这段代码违反了Core的并发模型,因为它使用私有队列上下文作为主线程的参数调用-[insertNewObjectForEntityForName::]

因此,我们应该将对backgroundContext的所有访问封装在传递给performBlock:或performBlockAndWait:的块中,该块在上下文的私有分派队列上执行该块:

代码语言:javascript
复制
[self.backgroundManagedObjectContext performBlockAndWait:^{
  NSManagedObject *mo = [NSEntityDescription insertNewObjectForEntityForName:@"Address" inManagedObjectContext:backgroundContext];
  mo.street = "Rue la place"
  [backgroundManagedObjectContext save:&error]
}];
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31430886

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档