2

インターネットからのデータを解析しているときに、回転するアクティビティ インジケーター (UIActivityIndi​​catorView) をアプリに追加しようとしています。IB の UIActivityIndi​​catorView に接続された IBOutlet (スピナー) があります。最初は次のように設定していました。

-

 (void) function {
        self.spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle: UIActivityIndicatorViewStyleWhite];
 self.spinner.hidesWhenStopped = YES;
 [spinner startAnimating];
 //parse data from internet
 [spinner stopAnimating];}

しかし、スピナーは回転しませんでした。すべてが同じスレッド上にあることに関係があると読みました。だから私はこれを試しました:

    - (void) newFunction {
        self.spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle: UIActivityIndicatorViewStyleWhite];
 self.spinner.hidesWhenStopped = YES;
 [spinner startAnimating];
 [NSThread detachNewThreadSelector: @selector(function) toTarget: self withObject: nil];
 [spinner stopAnimating];}

しかし、まだ運がありません。何か案は?ありがとう。

4

3 に答える 3

8

メソッドnewFunction:は次のようになります。

- (void) newFunction {
   self.spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite];
   self.spinner.hidesWhenStopped = YES;
   [NSThread detachNewThreadSelector: @selector(function) toTarget: self withObject: nil];
}

functionメソッドは次のようになります。

- (void) function {
   NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
   [self.spinner performSelectorOnMainThread:@selector(startAnimating) withObject:nil waitUntilDone:NO];

   //...

   [self.spinner performSelectorOnMainThread:@selector(stopAnimating) withObject:nil waitUntilDone:NO];
   [pool drain];
}
于 2010-12-19T03:43:15.533 に答える
0

「//インターネットからのデータの解析」が同期または非同期であることを確認してください。非同期とは、その時点から別のスレッドが開始され、現在の関数の実行が遅延なく続行されることを意味します。

2番目の例では、明示的に別のスレッドを作成しています。つまり@selector(function)、別のスレッドで発生し、次のステートメント[spinner stopAnimating]がすぐに実行されます。そのため、スピナーがまったく回転していないようです。

さらに、メイン スレッドでのみアクティビティ インジケーターを開始および停止するようにしてください。

于 2013-08-01T07:06:01.440 に答える
0

インジケーターを再度初期化しないでください。コードをこれに置き換えてください。

-(void) function {
    [spinner startAnimating];
    [self performSelector:@selector(newfunction) withObject:nil afterDelay:3.0];
}
- (void) newfunction {
     [spinner stopAnimating];
}

ありがとう。

于 2013-08-01T06:02:30.233 に答える