0

Grand Central Dispatchで、スピナーを開始したい---UIActivityIndicatorView長時間実行タスクを開始する前に回転します。

dispatch_async(cloudQueue, ^{

    dispatch_async(dispatch_get_main_queue(),
            ^{
                [self spinnerSpin:YES];
            });

    [self performLongRunningTask];

    dispatch_async(dispatch_get_main_queue(),
            ^{
                [self spinnerSpin:NO];
             });


});

spinnerSpin方法は次のとおりです。

- (void)spinnerSpin:(BOOL)spin {

    ALog(@"spinner %@", (YES == spin) ? @"spin" : @"stop");

    if (spin == [self.spinner isAnimating]) return;

    if (YES == spin) {

        self.hidden = NO;
        [self.spinner startAnimating];
    } else {

        [self.spinner stopAnimating];
        self.hidden = YES;
    }

}

[myView setNeedsDisplay]私がこれまでに議論したことのないことの1つは、との違い[myActivityIndicatorView startAnimating]です。それらは同じように動作しますか?

ありがとう、
ダグ

4

1 に答える 1

1

このメソッドは、のアニメーション状態[UIView setNeedsDisplay]とは何の関係もありません。UIActivityIndicatorView

setNeedsDisplay現在描画されている表現を無効にする方法でこのビューの状態が変更されたことをシステムに通知するだけです。drawRectつまり、次の描画サイクルでそのビューのメソッドを呼び出すようにシステムに要求します。

setNeedsDisplayビューを消費しているコードから、ビューの外部から呼び出す必要はほとんどありません。このメソッドは、ビューの再描画を必要とする内部状態で何かが変更されるたびに、ビューの内部ロジックコードによって呼び出されることを意図しています。

この[UIActivityIndicatorView startAnimating]メソッドはUIActivityIndicatorViewクラスに固有であり、単にインジケーターにアニメーション化(回転など)を開始するように要求します。このメソッドは、他のメソッドを呼び出す必要がなく、瞬時に実行されます。

startAnimatingちなみに、コードを呼び出すかstopAnimating、手動で表示/非表示にすることなく、コードを簡略化できます。UIActivityIndicatorViewクラスにはhidesWhenStoppedデフォルトでブール値のプロパティがあります。YESこれは、スピナーがアニメーションを開始するとすぐに表示され、アニメーションを停止すると非表示になることを意味します。

したがって、spinnerSpin:メソッドは次のようにリファクタリングできます(hidesWhenStoppedプロパティをに設定していない場合NO)。

- (void)spinnerSpin:(BOOL)spin {
    if (YES == spin) {
        [self.spinner startAnimating];
    } else {
        [self.spinner stopAnimating];
    }
}
于 2012-06-21T20:13:25.913 に答える