私の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グループにまとめて、登録した元に戻す操作をデータモデルの変更とともにグループ化する必要がありますか?
別の編集:また、元に戻す操作の実行順序を保証できますか?つまり、コアデータの変更が保存され、元に戻す操作が登録された後にundo
に電話すると、元に戻す操作が呼び出される前に削除されたエンティティが復活することを確認できますか?
キャンバスの一部を更新する必要がある場合は、 - (void)setNeedsDisplayInRect :(CGRect)invalidRectを使用できません。 – sosborn
いいえ、理由はいくつかあります。まず、私の描画はOpenGLを使って行われます。また、描画操作にはすべてのポイントスプライトの位置を見つけるための長い計算が必要で、描画ストロークごとにあらかじめ計算されていても、画面全体のすべてのストロークをレンダリングするには時間がかかりすぎる可能性があります。元に戻すことからどのデータが変更されたのかを知ることができるかどうか知っていますか?あなたの提案をありがとう。 – Stuart