2010-12-19 18 views
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];} 

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

答えて

8

あなたnewFunction:方法は次のようになります。

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

そして、あなたのfunction方法を次のようになります。あなたはこれであなたのコードを交換しなさいもう一度インジケータをintitializeべきではありません

- (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]; 
} 
+1

+1正解の場合、彼は何も見ていない理由は、彼がメインスレッドで開始した直後にアニメーションを停止するためです。 'performSelectorOnMainThread:withObject:waitUntilDone:'を実行する必要がある理由は、すべてのUI関連アクティビティがメインスレッドで発生するためですが、スピンナの開始/停止は他のスレッド内から発生する必要があるからです。 – jer

0

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

ありがとうございました。

0

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

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

また、メインスレッドのみのアクティビティインジケータの開始と停止を確認してください。

関連する問題