我使用托管对象上下文的回滚方法来丢弃所做的更改,但遇到了一个问题:
如果我有不同的 View Controller ,并且它们每个都可以对不同的数据库数据进行更改,并且如果第一个 Controller 执行回滚方法,我不希望它回滚第二个 Controller 所做的更改。无论如何只回滚特定实体,但不是全部?
还是我应该使用多个托管对象上下文?
最佳答案
您不能只回滚 NSManagedObjectContext
的部分更改集.做你所说的最好的方法是制作一个新的NSManagedObjectContext
那是父上下文的子项。保存时,更改会推送到父级(您必须确保保存父级上下文以实际持久保存到磁盘)。此外,如果您以这种方式隔离变更集,您甚至不必调用 rollback
在子上下文中,您可以将它们扔掉。
请注意,要使用 NSManagedObjectContext
的父/子关系你必须 initWithConcurrencyType:
初始化所有上下文的方法,并且您必须指定 NSPrivateQueueConcurrencyType
或 NSMainQueueConcurrencyType
.需要注意的是,这会影响您访问上下文的方式。如果您不在使用并发类型为 NSMainQueueConcurrencyType
的上下文的主队列上,您必须将所有与上下文交互的方法调用放在一个 block 中并将其传递给上下文 performBlock:
或 performBlockAndWait:
方法。
关于这个主题的文档相当薄。我可以在 WWDC 视频之外找到的唯一引用是 this iOS 5 release notes document .
关于ios核心数据回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18174100/