1

ユーザーが画面上でオブジェクトをドラッグできるコアデータベースのUIKitアプリケーションがあります。オブジェクトがドラッグされている間、各touchesMoved:イベントでその位置属性を更新します。ドラッグ操作の取り消しを一度にサポートするために、ドラッグの開始時に新しい取り消しグループを開始し、ユーザーが指を離したときにグループを終了します。

メモリを節約し、元に戻す操作を高速化するために、ドラッグ操作に属する元に戻るデータを合体させたいのですが、CoreDataではこれが困難です。問題はprocessPendingChanges、各実行ループサイクルの最後に呼び出され、CoreDataにその反復で発生した位置変更の新しいUNDOレコードをファイルするように強制することです。ドラッグ操作では、このような元に戻すレコードを何百も簡単に蓄積できますが、最初のレコードを除くすべてが不要です。

Core Dataの魔法の組み込みアンドゥサポートを使い続ける方法はありますが、そのような重複したアンドゥレコードで貴重なメモリを無駄にすることはありませんか?元に戻す/やり直し操作全体でオブジェクトグラフの一貫性を維持する必要がないのは気に入っていますが、これらの継続的な属性の更新を正しく処理できないことは、目を見張るもののようです。

4

2 に答える 2

3

元に戻るマネージャーsetGroupsByEvent:を設定すると、やりたいことができると思います。

受信者が実行ループ中に元に戻る操作を自動的にグループ化するかどうかを指定するブール値を設定します。はいの場合、レシーバーは実行ループを通過するたびに元に戻るグループを作成します。いいえの場合はそうではありません。

よりクリーンな解決策は、ドラッグイベントが終了するまで、オブジェクトの位置をデータモデルにコミットしないことです。

于 2010-07-22T14:13:05.990 に答える
0

1つの解決策は、最初のドラッグイベントの後ですべての取り消し登録を無効にし、ジェスチャ全体が終了するまで無効のままにすることです。

オンになっている場合はgroupsByEvent、登録がオフのときに、イベントの終了時に暗黙のグループを自動的に終了するメッセージを含め、元に戻るマネージャーがすべてのグループ化メッセージを無視することに注意する必要があります。したがって、実行ループの最後に登録をオフのままにする場合は、暗黙のグループを自分で手動で閉じる必要があります。

[moc processPendingChanges];
while ([moc.undoManager groupingLevel])
    [moc.undoManager endUndoGrouping];
[moc.undoManager disableUndoRegistration];

ドラッグジェスチャが終了したら、次のコードを使用して元に戻る登録を再度有効にできます。

[moc processPendingChanges];
[moc.undoManager enableUndoRegistration];

この解決策は機能しますが、少し厄介です。TechZenによって提案されたものは、はるかにクリーンです。ドラッグジェスチャが完了するまで、モデル属性を更新しないでください。

于 2010-07-23T22:14:30.757 に答える