1

我使用托管对象上下文的回滚方法来丢弃所做的更改,但我遇到了一个问题:如果我有不同的视图控制器,并且每个视图控制器都可以对不同的数据库数据进行更改,并且如果第一个控制器执行回滚方法,我不希望它回滚第二个控制器所做的更改。无论如何只回滚特定实体,但不是全部?还是我应该使用多个托管对象上下文?

4

1 回答 1

8

您不能仅回滚NSManagedObjectContext. 做你所说的最好的方法是创建一个新的NSManagedObjectContext,它是父上下文的孩子。保存时,更改会推送到父级(您必须确保保存父级上下文以实际持久保存到磁盘)。此外,如果您以这种方式隔离更改集,您甚至不必调用rollback子上下文,您可以将它们丢弃。

请注意,要使用 的父/子关系,NSManagedObjectContext您必须使用initWithConcurrencyType:初始化所有上下文的方法,并且必须指定NSPrivateQueueConcurrencyTypeNSMainQueueConcurrencyType。需要注意的是,这会影响您访问上下文的方式。如果您不在使用并发类型为 的上下文的主队列中NSMainQueueConcurrencyType,则必须将与上下文交互的所有方法调用放在一个块中并将其传递给上下文performBlock:performBlockAndWait:方法。

关于这个主题的文档相当薄。我可以在 WWDC 视频之外找到的唯一参考资料是这个 iOS 5 发行说明文档

于 2013-08-11T16:49:23.867 回答