我使用托管对象上下文的回滚方法来丢弃所做的更改但我遇到了一个问题: 如果我有不同的视图控制器,并且每个视图控制器都可以对不同的数据库数据进行更改,并且如果第一个控制器执行回滚方法,我不希望它回滚第二个控制器所做的更改。无论如何只是回滚一个特定的实体,但不是全部? 或者我应该使用多个托管对象上下文?
答案 0 :(得分:8)
您无法仅回滚NSManagedObjectContext
的部分更改集。做你正在谈论的最好的方法是创建一个新的NSManagedObjectContext
,它是父上下文的孩子。保存时,更改会被推送到父级(您必须确保将父上下文保存为实际保留到磁盘)。此外,如果您以这种方式隔离更改集,您甚至不必在子上下文中调用rollback
,您可以将它们丢弃。
请注意,要使用NSManagedObjectContext
的父/子关系,您必须使用initWithConcurrencyType:
方法初始化所有上下文,并且必须指定NSPrivateQueueConcurrencyType
或NSMainQueueConcurrencyType
。请务必注意,这会影响您访问上下文的方式。如果使用并发类型为NSMainQueueConcurrencyType
的上下文不在主队列中,则必须将与上下文交互的所有方法调用放在块中并将其传递给上下文performBlock:
或performBlockAndWait:
方法。
该主题的文档相当薄。我在WWDC视频之外找到的唯一参考是this iOS 5 release notes document。