【问题标题】:Can you edit the same NSManagedObject in 2 different ManagedObjectContexts and merge their changes?您可以在 2 个不同的 ManagedObjectContexts 中编辑相同的 NSManagedObject 并合并它们的更改吗?
【发布时间】:2012-02-16 21:45:05
【问题描述】:

我正在与 MySQL 数据库同步。

最初,我打算遍历所有新的/修改的对象并为该对象设置所有外键,然后执行下一个对象,依此类推……但这是很多获取请求。

因此,我想循环遍历所有新的/修改的对象,并一次设置一个外键。所以第一次遍历我的对象设置 fk1,我的下一次设置 fk2,依此类推......

酷,获取请求大大减少。现在我很好奇我是否可以线程化这些 fk 设置器。它们不相互依赖,但它们正在修改同一个对象,即使它们只是设置一种关系,而且是不同的关系。用 git 术语来说,这些更改可以“合并”在一起而没有任何冲突,但是是否可以将一个子 managedObjectContext(childContext:save) 中的更改推送到 parentManagedObjectContext(parent:performBlock^{parent:save}) 并拉它在另一个不同的子 managedObjectContext(???) 中?或者合并策略是否只采用一个 childContext 的对象版本,而让其他 fks 有效地保持不变。

我知道这存在:NSManagedObjectContext/refreshObject:mergeChanges:

但这是逐个对象级别的。这会导致一堆提取吗?还是会一次/分批更新我的整个上下文?

从这里遵循 Apple 的建议: https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdImporting.html 在开始设置任何关系之前,我已经创建/更新了我的值,因此在我尝试将任何关系指向它们之前,所有实体都已经存在。

顺便说一句:我们有几个应用程序可以从并发中受益,因为它们会抛出大量数据,而对于四核 iPad 应用程序,这确实有助于缩短初始同步所需的时间。

【问题讨论】:

    标签: ios core-data nsmanagedobjectcontext


    【解决方案1】:

    我不确定你想做什么以及为什么(你可以在你的问题中写更少的行并且更清楚),但这里有一些使用 Core Data 的指南:

    -- NSManagedObjectContext 不是线程安全的。因此,您需要限制对这个托管对象上下文的访问发生在 1 个线程内。否则,您最终可能会遇到许多您无法理解的错误。 -- NSManagedObjectContexts 除了做其他事情之外,就像你的持久存储的“快照”一样。这意味着当您更改一个对象时,您将其保存到持久存储中,您发布一个 NSManagedObjectContextDidSaveNotification 然后在程序的另一个位置调用 mergeChangesFromContextDidSaveNotification: 以便从持久存储加载最新数据。注意线程安全。

    NSManagedObjectContext/refreshObject:mergeChanges:根据苹果的说法,不仅仅是刷新一个托管对象。如果您将 YES 作为第二个参数传递,它将将此托管对象上下文中的任何未决更改写入持久存储,并将从持久存储加载对此对象的其他属性的任何其他更改,从而“同步”您的对象与持久存储。如果您将 NO 作为第二个参数传递,则该对象将丢失任何挂起的更改,并且将其转为故障。这意味着当您尝试访问它时,托管对象上下文将重新加载该对象,因为它上次保存到数据库中。它不会重新加载整个托管对象上下文。它只会对对象进行操作。

    旁白:我写了一个blog post,它触及了从核心数据数据库异步加载的表面。就我而言,由于我正在处理数据库的繁重工作,因此我最终使用了一个使用其自己的 NSManagedObjectContext 运行的 NSOperation,并使用串行 GCD 队列来保存大块数据,因为它比让多个线程访问更快相同的持久存储,即使它们在不同的托管对象上下文中操作。

    希望我能帮上忙。

    【讨论】:

    • 谢谢。是的,我正在使用块操作,这就是我说线程时所指的。我想澄清 NSManagedObjectContext/refreshObject:mergeChanges: 的工作原理确实是我所追求的。在浏览了您的博客文章后,我可能会重新考虑对我的同步的 ForeignKey 部分进行多线程处理,因为我试图使其尽可能通用,并且数据模型可能会变得非常复杂。今晚下班后我会仔细梳理一下。再次感谢。
    猜你喜欢
    • 2013-09-29
    • 2018-03-17
    • 2015-08-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 2013-09-01
    相关资源
    最近更新 更多