8

UIActivityIndi​​catorView で startAnimating を呼び出すと、開始しません。どうしてこれなの?

【ブログ形式の自問自答です。以下の解決策は私にとってはうまくいきますが、他にもっと良い解決策があるのではないでしょうか?]

4

6 に答える 6

16

次のようなコードを書く場合:

- (void) doStuff
{
    [activityIndicator startAnimating];
    ...lots of computation...
    [activityIndicator stopAnimating];
}

すべての計算がメイン スレッド上にあるため、アクティビティ インジケーターを実際に開始および停止する時間を UI に与えていません。1 つの解決策は、別のスレッドで startAnimating を呼び出すことです。

- (void) threadStartAnimating:(id)data {
    [activityIndicator startAnimating];
}

- (void)doStuff
{ 
    [NSThread detachNewThreadSelector:@selector(threadStartAnimating:) toTarget:self withObject:nil];
    ...lots of computation...
    [activityIndicator stopAnimating];
}

または、計算を別のスレッドに置き、それが終了するのを待ってから stopAnimation を呼び出すこともできます。

于 2009-12-04T23:02:16.210 に答える
12

私は通常、次のことを行います。

[activityIndicator startAnimating];
[self performSelector:@selector(lotsOfComputation) withObject:nil afterDelay:0.01];

...

- (void)lotsOfComputation {
    ...
    [activityIndicator stopAnimating];
}
于 2009-12-24T00:05:26.567 に答える
1

この質問は非常に役に立ちます。しかし、回答の投稿に欠けていることの 1 つは、長い時間がかかるすべてのものは、UIActivityIndi​​catorView ではなく別のスレッドで実行する必要があることです。これにより、UI インターフェイスへの応答が停止しなくなります。

    - (void) doLotsOFWork:(id)data {
    //  do the work here.
}

    -(void)doStuff{
    [activityIndicator startAnimating]; 
    [NSThread detachNewThreadSelector:@selector(doLotsOFWork:) toTarget:self withObject:nil]; 
    [activityIndicator stopAnimating];
}
于 2012-12-19T10:38:58.973 に答える
1

必要に応じて、swift 3 バージョン:

func doSomething() {
    activityIndicator.startAnimating()
    DispatchQueue.global(qos: .background).async {
        //do some processing intensive stuff
        DispatchQueue.main.async {
            self.activityIndicator.stopAnimating()
        }
    }
}
于 2016-10-02T06:34:54.460 に答える
0

わかりました、申し訳ありませんが、盲目的にコードを実行したようです。

次のようにインジケーターを終了しました。

    [activityIndicator removeFromSuperview];
activityIndicator = nil;

したがって、1 回の実行後、activityIndi​​cator は完全に削除されます。

于 2009-12-25T11:14:27.083 に答える