接続状態を追跡するNSViewがあるOSXアプリケーションで作業しています。接続がアップしている場合は緑色の点が表示され、接続がダウンしている場合は赤色のドットが表示されます。
Core Animationを使用してこれをアニメーション化したかったのですが、接続状態が急激に変化する状況で問題が発生します。アニメーションは別のスレッドで発生し、ブロックされないため、ビューの現在の場所を取得するときに、それがまだアニメーション化されている場合は、必要なものの中間にあるものを取得します。
たとえば、NSView内に@property
、状態を設定し、緑と赤のドットをアニメーション化するためにオーバーライドしているconnectionStateという名前があります。
- (void)setConnectionState:(BOOL)online
{
NSPoint newPosition;
if (online) {
newPosition = NSMakePoint(self.iconView.frame.origin.x,
self.iconView.frame.origin.y + 32);
} else {
newPosition = NSMakePoint(self.iconView.frame.origin.x,
self.iconView.frame.origin.y - 32);
}
[NSAnimationContext beginGrouping];
[[NSAnimationContext currentContext] setDuration:0.5];
[self.iconView.animator setFrameOrigin:newPosition];
[NSAnimationContext endGrouping];
_connectionState = online;
}
ご覧のとおり、接続状態が急激に変化すると、self.iconView.frame
正しくなく、newPosition
位置がずれてしまいます。
私が見たいのは、ビューがそれ自体をアニメーション化し、完了するまで待ってから、もう一度それ自体をアニメーション化することです。
while(true)
おそらく解決策は、キューを作成し、接続状態情報を1つのスレッドのキューに追加し続け、そのキューからプルし、アニメーション化し、待機するステートメントを持つ別のスレッドをバックグラウンドに置くことだと思いました。完了のために、そしてこの広告を無限に行います。ただし、これは非常に不格好な解決策のようです。
問題を解決するための正しいデザインパターンは何ですか?