ビューを (表示することによって) アニメーション化した後、(アニメーションが完了したら) 通知を投稿する必要があります。ただし、アプリの設計方法では、ビューが非表示になったときに (アニメーションを介して) 別の通知が送信されます。したがって、基本的に「showView」と「hideView」メソッドがあります。それぞれ次のようにします。
[NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) {
[context setDuration: 0.25];
[[myView animator] setAlphaValue: 0];
} completionHandler:^{
// post notification now
}];
問題は、バックグラウンドの別のスレッドに、「健全性チェック」を実行する定期的なタイマーがあり、ビューが必要ない場合は非表示にする必要があるかどうかを確認することです。これは積極的なアプローチですが、アプリの多くのコンポーネントがさまざまなイベントやシナリオに対応するために必要です。このため、ユーザーが「showView」をクリックしたときに「競合状態」が発生することがありますが、同時に、スレッドの1つがビューをすぐに非表示にする必要があると感じています。
両方がメイン スレッドに通知を投稿すると、アプリは SpinLock で無期限にハングします。上記のアニメーション ブロックが「キャンセル」されたかどうか (つまり、同じビューで別のアニメーション ブロックが実行されたかどうか) を把握できれば、この状況を完全に回避できます。そのような状況では、通知を投稿しないので、チェックは強制されません。
簡単に言えば、アニメーションが正常に終了した後に「completionHandler」が呼び出されたかどうか、またはアニメーションがキャンセルされたかどうかを確認できる必要があります。iOS ではこれが可能であることはわかっていますが、OS X ではこれを行う方法が見つかりません。助けてください。