UIActivityIndicatorView で startAnimating を呼び出すと、開始しません。どうしてこれなの?
【ブログ形式の自問自答です。以下の解決策は私にとってはうまくいきますが、他にもっと良い解決策があるのではないでしょうか?]
UIActivityIndicatorView で startAnimating を呼び出すと、開始しません。どうしてこれなの?
【ブログ形式の自問自答です。以下の解決策は私にとってはうまくいきますが、他にもっと良い解決策があるのではないでしょうか?]
次のようなコードを書く場合:
- (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 を呼び出すこともできます。
私は通常、次のことを行います。
[activityIndicator startAnimating];
[self performSelector:@selector(lotsOfComputation) withObject:nil afterDelay:0.01];
...
- (void)lotsOfComputation {
...
[activityIndicator stopAnimating];
}
この質問は非常に役に立ちます。しかし、回答の投稿に欠けていることの 1 つは、長い時間がかかるすべてのものは、UIActivityIndicatorView ではなく別のスレッドで実行する必要があることです。これにより、UI インターフェイスへの応答が停止しなくなります。
- (void) doLotsOFWork:(id)data {
// do the work here.
}
-(void)doStuff{
[activityIndicator startAnimating];
[NSThread detachNewThreadSelector:@selector(doLotsOFWork:) toTarget:self withObject:nil];
[activityIndicator stopAnimating];
}
必要に応じて、swift 3 バージョン:
func doSomething() {
activityIndicator.startAnimating()
DispatchQueue.global(qos: .background).async {
//do some processing intensive stuff
DispatchQueue.main.async {
self.activityIndicator.stopAnimating()
}
}
}
わかりました、申し訳ありませんが、盲目的にコードを実行したようです。
次のようにインジケーターを終了しました。
[activityIndicator removeFromSuperview];
activityIndicator = nil;
したがって、1 回の実行後、activityIndicator は完全に削除されます。