私はここ数か月 Cocoa をいじり回しており、iTunes トラックのメタデータを調整できる、厳密に学習目的で書いている Cocoa アプリに元に戻す/やり直しのサポートを追加しようとしています。NSUndoManager のメソッドのおかげでprepareWithInvocationTarget:
、基本が整っています。たとえば、選択したトラックの再生回数と最終再生日の変更を元に戻したりやり直したりできます。(私は appscript-objc を使用して iTunes トラック データを取得/設定しています。)
ただし、多数の iTunes トラックの更新には少し時間がかかる可能性があるため、ユーザーが進行中に元に戻す/やり直し操作をキャンセルできるようにしたいと考えていますが、これを達成するための明確なメカニズムは見当たりません。 NSUndoManager で。どうすればこれを行うことができますか?
編集:
明確にするために、これについてもう少し考えてみると、私が本当に求めているのは、元に戻す/やり直しスタックを操作して、Rob Napier が回答で言及している「一貫性のない状態」を回避する方法だと思います。
そのため、変更を加えずに失敗した元に戻す操作 (たとえば、元に戻すを呼び出す前に、ユーザーが Apple Events をブロックする iTunes の [設定] ウィンドウを開いた場合) に応答して、元に戻す操作が元に戻すスタックの一番上に残る可能性があります。 REDO スタックは変更されません。操作が途中でキャンセルまたは失敗した場合は、実行された変更 (ある場合) を元に戻す操作をやり直しスタックにプッシュし、実行されなかった変更を適用する操作を元に戻すスタックの上に置きたいと思います。成功しません。元に戻すスタックとやり直しスタックの間で操作を効果的に分割すると、ユーザーの混乱を招く可能性があると思いますが、問題を処理する最も寛容な方法のようです。
これに対する答えは、「あなた自身のUndo Managerを書いてください」、「あなたの元に戻す操作は失敗するべきではありません」、または「これを不必要に複雑にしすぎている」のいずれかであると思いますが、私は興味があります. :)