1
-(void)buttonClick:(id)sender
{    
    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
    for(int i=0;i<500000000;i++)
    {
        //Simulates network activity
    }
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
}

理論的には、画面の左上隅にあるネットワークアクティビティスピナーがオンになり、しばらくスピンしてからオフになります...ただし、表示されることはありません。

-(void)buttonClick:(id)sender
{
    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
    for(int i=0;i<500000000;i++)
    {
        //Simulates network activity
    }
    //[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
}

「=NO」がコメントアウトされていると、プログラムがforループ全体を実行し、forループが完了した後、スピナーが最終的に回転を開始することに気付きました。

-(void)viewWillAppear:(BOOL)animated
{
    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES
}

-(void)buttonClick:(id)sender
{
    for(int i=0;i<500000000;i++)
    {
        //Simulates network activity
    }
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
}

これで、ビューが表示されると、インジケーターが回転し始めます。ボタンをクリックすると、ループの実行中にボタンが回転し続けます。forループが終了すると、スピナーは期待どおりに停止します。

-=-=-=-=-=-=-=-=-=-

私の質問はこれです、なぜ最初の2つの例のforループの後までスピナーが回転し始めないのですか?

-=-=-=-=-=-=-=-=-=-

これまでの私の考え:

この特定の例でスピナーが起動しない理由については...おそらくメッセージを送信しますが、コンパイルされたコードがどのように機能するかにより、forループが終了するまで実行されませんか?

おそらく、これを行う正しい方法は、ネットワークアクティビティインジケーターを有効にしてから、ネットワークアクティビティを実行する別のスレッドを起動し、そのスレッドが完了すると、メインスレッドにメッセージを送信することです(おそらく、取得したデータも使用します)。

-=-=-=-=-=-=-=-=-

任意のアドバイス/回答をいただければ幸いです。前もって感謝します。このアプリはiPad用であることに注意してください。

4

2 に答える 2

3

UI は、現在の実行ループが終了するまで更新されません。メソッドは現在、作業中にメインスレッドをブロックしているため、プログラムが実行ループの最後に到達する機会がありません。

したがって、実行時間の長いタスクをメイン スレッドから切り離す必要があります。

[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{

    for(int i=0;i<500000000;i++)
    {
        //Simulates network activity
    }

    dispatch_async(dispatch_get_main_queue(), ^{
        [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
    });
});
于 2012-04-25T20:42:41.737 に答える
1

//ネットワーク アクティビティをシミュレートするためのメソッドを作成し、そのメソッドを呼び出すだけです。

- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay

何かのようなもの:

-(void)buttonClick:(id)sender
{   
    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(queue, ^{
        [self performSelector:@selector(simulateNetworkActivity) withObject:nil afterDelay:0];
    });
}

次のようなものを含むメソッド:

-(void)simulateNetworkActivity
{
    for(int i=0;i<500000000;i++)
    {
        //Simulates network activity
    }
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
}
于 2012-04-25T20:02:47.600 に答える