CoreDataはメモリ上にデータを管理(NSManagedObjectContext)しているため、保存処理は十分注意する必要がある。
例えば、新規でレコードを作りそれをキャンセル(メモリ破棄)する場合、deleteObjectsで削除してコミット(save)すれば動作するでしょう。
新規でない場合、しかし、既にフェッチしたデータを編集する場合は注意です。 やっぱりキャンセルしようとdeleteObjectsを使うと、その名の通りデータが削除されてコミットされてしまいます。
NSManagedObjectContextに、saveやundo等の処理が定義されています。
- (NSSet *)insertedObjects;
- (NSSet *)updatedObjects;
- (NSSet *)deletedObjects;
- (NSSet *)registeredObjects;
- (void)undo;
- (void)redo;
- (void)reset;
- (void)rollback;
- (BOOL)save:(NSError **)error;
- (void)lock;
- (void)unlock;
- (BOOL)tryLock;
キャンセルする場合、差し当たりrollbackで良さそうだけどちょっと自信はない。。。 それぞれの挙動は、時間あったら調べておきます。
ちなみに、undoManagerってのも存在するので1つずつ戻すってことも簡単に(?)できそうです。