iPadアプリケーション(OpenGL描画アプリ)にやや複雑なデータモデルがあり、元に戻す/やり直し機能の実装に取り組んでいます。Core Dataがデータモデルの変更を無料で元に戻すという事実は気に入っていますが、組み込みの機能で十分かどうかはわかりません。
描画アプリに元にされる/やり直しが実装されている例をたくさん見てきましたが、それらは一般的に次のことを行います。
- 管理対象オブジェクトのコンテキストをに伝えます
undo
。 - 変更したデータモデルからページ上のすべてを再描画します。
これはひどく非効率的です-私のアプリでは、「元に戻されている」特定のオブジェクトに基づいて元に戻すアクションを実行できる必要があります。これは、多くの場合、キャンバスの一部のみを更新することを意味します。
だから私の質問はこれです:私は自分の取り消し操作を登録し、それを組み込みの取り消しと組み合わせて使用できますか?たとえば、ユーザーが線を引いたときに次のようにするとします。
- (void)drawLineFromPoint:(CGPoint)startPoint toPoint:(CGPoint)endPoint
{
// Register the undo operation.
[[[managedObjectContext undoManager] prepareWithInvocationTarget:self]
removeObjectWithIndex:nextObjectIndex];
// Draw the line object.
[self drawLineObjectWithIndex:nextObjectIndex fromPoint:startPoint toPoint:endPoint];
// Save the new object to the data model.
[MyCoreDataHelper saveLineObjectWithIndex:nextObjectIndex fromPoint:startPoint toPoint:endPoint];
nextObjectIndex++;
}
このアクションを元に戻すと、呼び出しが実行され、モデルが適切に変更されますか?NSUndoManager
または、この状況では、組み込みの管理対象オブジェクトコンテキスト取り消しシステムを放棄し、データモデルを自分で削除および編集するなど、を使用して自分自身をロールバックする必要がありますか?組み込みの元に戻る/やり直しが実際に何を元に戻すのかわからない限り、これはひどく厄介で複雑になる可能性があるようです...
編集:(上記のアイデアが機能する場合)登録された元に戻す操作がデータモデルの変更とともにグループ化されるように、それを元に戻すグループにラップする必要があると思いますか?
別の編集:また、元に戻すアクションが実行される順序を保証できますか?つまり、undo
コアデータの変更が保存され、元に戻すアクションが登録された後に呼び出す場合、元にされるアクションが呼び出される前に、削除されたエンティティが復元されることを確認できますか?