gpt4 book ai didi

ios - 如何从子队列中保存父 NSManagedObjectContext?

转载 作者:行者123 更新时间:2023-12-01 19:15:40 26 4
gpt4 key购买 nike

我有以下设置:

NSManagedObjectContext *parent = [[NSManagedObjectContext alloc] 
initWithConcurrencyType:NSMainQueueConcurrencyType];
// other setup for parent

NSManagedObjectContext *child = [[NSManagedObjectContext alloc]
initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[child setParentContext:parent];

我想要的是在 child 保存时保存 parent ,所以目前我做这样的事情:
[child performBlock^{
[child save:nil];
[parent performBlock:^{
[parent save:nil];
}
}];

那是我的安全,并在上下文自己的队列中调用 save 。那有必要吗?我可以这样做:
[child performBlock^{
[child save:nil];
[parent save:nil];
}];

最佳答案

不,您不能使用第二种变体。您将执行 save对与子上下文相关联的队列上的父上下文的操作,而不是主队列。

这意味着 save操作将在(可能)与主线程不同的线程上执行,这是不允许的,因为托管对象上下文不是线程安全的。

另见 Concurrency Support for Managed Object Contexts
在 OS X v10.7 和 iOS 5.0 的核心数据发行说明中:

You use contexts using the queue-based concurrency types in conjunction with two new methods: performBlock: and performBlockAndWait:. ... The one exception is: if your code is executing on the main thread, you can invoke methods on the main queue style contexts directly instead of using the block based API.

performBlock: and performBlockAndWait: ensure the block operations are executed on the queue specified for the context. ...

关于ios - 如何从子队列中保存父 NSManagedObjectContext?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13533808/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com