- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
上下文:使用 Core Data,我在私有(private)队列上有一个主上下文(我将调用 mainContext
),在主队列上有另一个上下文,主队列的子队列(我将调用子上下文
)。队列无关紧要,我的问题的答案不应取决于上下文所在的队列。
我的目标是将 childContext
的修改直接保存到磁盘,而不让 mainContext
有机会在 childContext< 带来的修改之前进行任何修改
被保存到磁盘。
为了做到这一点,我调用:
[self.childContext performBlockAndWait:^{
[self.parentContext performBlockAndWait:^{
[self.childContext save:NULL];
[self.parentContext save:NULL];
}];
}];
背后的想法是,如果我执行一个 block 并同时等待子上下文和父上下文,则在保存子上下文时不能对主上下文进行任何修改。然后主上下文被保存,我们退出 block 。该文档明确指出对 performBlockAndSave:
的调用是可重入的,因此这应该有效。
是吗?对 performBlockAndWait:
的嵌套调用是否有效?显然,保存都是在 mainContext
的队列上完成的,并且 childContext
的队列在保存期间没有被锁定。正常吗?如果是这样,我怎样才能实现我的目标?
注意:由于我与 API 通信的方式,我需要这种原子性。为了在我的 API 上创建一个对象,我在本地创建对象,然后检查 Core Data 上下文中的本地修改,并将这些修改转换为 API 调用。如果我打电话:
[self.childContext performBlockAndWait:^{
[self.childContext save:NULL];
/* 1 */
[self.parentContext performBlockAndWait:^{
[self.parentContext save:NULL];
}];
}];
有可能在 performBlockAndWait:
保存 mainContext 之前调用
(在 mainContext
上的 performBlock:
1
)。此调用将有一个“不干净”的上下文,childContext
中的更改等待保存在磁盘上。
最佳答案
我认为解决方案是在上下文层次结构的下方创建更多的子上下文。
为了清楚起见,请允许我重新命名您的上下文:
我们将 mainContext
称为 rootContext
(后台,保存到持久存储)。
我们将 childContext
称为 mainContext
(主线程上下文,rootContext
的子级)。
让我们将任何较低的子上下文称为“工作上下文”(背景,mainContext
的子上下文)。
worker 上下文应该是以主上下文为父上下文的背景上下文。
你可以有一个中心位置,根上下文将保存到物理商店,例如你在哪里管理你的核心数据堆栈。
据我了解,当通过 save:
将更改从 worker 上下文推送到主上下文时,同时主上下文本身也在 performBlockAndWait
block ,它只会在完成后获取更改。只有这样它才能将它们进一步推到根上下文以进行物理保存。我认为这应该可以实现您的原子性目标。
通过引入工作上下文,您可以确保根上下文不会从主上下文以外的任何其他地方接收任何更新。
关于ios - 是否递归调用 performBlockAndWait : allowed?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30926746/
我正在创建一个 NSManagedObjectContext在私有(private)队列中处理我从文件和/或服务中获取的数据更新: NSManagedObjectContext *privateCon
Utility.managedObjectContext().performBlockAndWait({ }) dispatch_sync(dispatch_get_main_queue(), { }
上下文:使用 Core Data,我在私有(private)队列上有一个主上下文(我将调用 mainContext),在主队列上有另一个上下文,主队列的子队列(我将调用子上下文)。队列无关紧要,我的问
在核心数据最佳实践的 WWDC 2012 视频中,那个人说 performBlockAndWait: 不包含自动释放池。 (而 performBlock: 确实如此) 为什么不呢?这样做的具体后果是什
我正在编写一个函数来执行一些 CoreData 的东西。我希望函数仅在 所有 CoreData 操作执行完毕后返回。 CoreData 涉及在后台上下文中创建一个对象,然后在父上下文中执行更多操作:
我从已发布的应用程序中获得以下崩溃报告: synchronizeMyWords 方法从数据库中获取实体,创建具有主上下文父级的私有(private)队列上下文,最后保存结果。所有操作都在后台线程中。每
我遇到了无法解决的 Core Data 问题。我以艰难的方式了解了核心数据中的并发问题,因此我非常小心,只在 performBlock: 和 performBlockAndWait: block 中执
我有一个下载一些数据的 NSURLSession(带有委托(delegate))。我不希望启动下载 (refresh) 的方法在执行委托(delegate)方法之前返回。为此,我在 refresh 的
print("queue1: \(NSOperationQueue.currentQueue())") managedObjectContext.performBlockAndWait({ p
在将 NSManagedObjectContext 的 performBlock: 与通知中心一起使用时,我遇到了有趣的行为。 我从主 UI 线程触发异步数据下载(使用 NSURLConnection
我有一个 OSX 应用程序,我在其中使用父/子 NSManagedObjectContext 设置。子 MOC 具有 NSPrivateQueueConcurrencyType 并且是我主要使用的类型
我有一个 NSManagedObjectContext 声明如下: - (NSManagedObjectContext *) backgroundMOC { if (backgroundMOC
我注意到,对于 NSManagedObjectContext 和 NSMainQueueConcurrencyType 来说,performBlockAndWait 是可能的:并在除接收者的(主)队列
仍在开发我的 RSS 阅读器。 我的数据模型大致由以下 NSManagedObject 层次结构组成: Category > Feed > Post 我的应用程序使用以下内容: 具有 NSPrivat
我有两个 NSManagedObjectContext,名为 importContext 和 childContext。 childContext 是 importContext 的 child ,它
更新:我已经准备好了可以无问题地再现问题的示例,请使用以下URL下载测试项目: https://www.dsr-company.com/fm.php?Download=1&FileToDL=DeadL
我使用的是 Xcode 7.1,在打开我现有的应用程序时收到此警告。如果有人展示使用 -performBlockAndWait: 的方法将会很有帮助 谢谢 最佳答案 正如 Mundi 所说,您不需要锁
我是一名优秀的程序员,十分优秀!