0

私の要件は、データが JSON から取得されているときにアクティビティ インジケーターを表示する必要があることですが、データの取得は 1 つのメソッドでのみ実行されます。つまり、たとえばボタンをクリックすると、JSON からデータが取得され、そのテーブルがテーブル ビューに表示されます。ビューは別のビュー コントローラーに存在します。ここで私の状況は、ユーザーがボタンをクリックしてデータを取得し、次のビューに移動する必要がある場合です。データを取得しているときは、アクティビティ インジケーターを表示する必要があります。

-(void)searchBtnActn {

    [self.webViewActivityIndicator setHidden:NO];

    [self.view addSubview:webViewActivityIndicator];

    [self.view bringSubviewToFront:webViewActivityIndicator];

    [webViewActivityIndicator startAnimating];

    if ([textField.text intValue] > 0)
    {
        AppDelegate *sharedDelegate = [[UIApplication sharedApplication]delegate];
        sharedDelegate.textFldData = textField.text;

        DealerLocationMapViewController *dealerLocationObj = [[DealerLocationMapViewController alloc]initWithNibName:@"DealerLocationMapViewController" bundle:nil];

        dispatch_queue_t queue = dispatch_get_global_queue(
                                                       DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
        dispatch_async(queue, ^{
             [dealerLocationObj searchBtnmethod:textField.text];

              [webViewActivityIndicator performSelectorOnMainThread:@selector(stopAnimating) withObject:nil waitUntilDone:YES];
    });

        [self.navigationController pushViewController:dealerLocationObj animated:YES];
    [dealerLocationObj release];
}
4

2 に答える 2

1

ここで、メソッド名があまり明確ではないという仮定を立てます。

見つめている:

dispatch_async(queue, ^{
    [dealerLocationObj searchBtnmethod:textField.text];

    [webViewActivityIndicator performSelectorOnMainThread:@selector(stopAnimating) withObject:nil waitUntilDone:YES];
});

それsearchBtnmethod:はおそらくWebサービス呼び出しを行っているメソッドであり、非同期で実行したいので、dispatch_asyncブロックに入れています。

その場合は、いくつかの順序が間違っています。

メイン スレッドをブロックしたくないため、このメソッドが Web サービスへの同期呼び出しである場合は、非同期ブロックを使用するのが正しい方法です。ただし問題は、すぐに電話をかけていることです

[self.navigationController pushViewController:dealerLocationObj animated:YES];

ブロックがディスパッチされた後、つまり Web サービス呼び出しが終了する前にビューがプッシュされているため、Web サービス呼び出しの間、アクティビティ インジケーターのアニメーションが表示されません。

コードを次のように再構築します。つまり、私の仮定が正しかった場合です...

dispatch_async(queue, ^{
    [dealerLocationObj searchBtnmethod:textField.text];

    dispatch_async(dispatch_get_main_queue(), ^{
        [webViewActivityIndicator stopAnimating];
        [self.navigationController pushViewController:dealerLocationObj animated:YES];
    });
});

これにより、ブロックがメイン キューにディスパッチされ、アクティビティ インジケーターが停止し、終了後にdealerLocationObjビュー コントローラーがプッシュされます。searchBtnmethod:

于 2013-04-17T06:14:36.573 に答える
1

基本的に、呼び出しをActivityIndicator2 つのクラス間で共有する必要があります。

この機能については、すでに優れたプロジェクトがあります。再発明するのではなく、それらを試してみてください。それらは優れており、多くのアプリケーションで使用されています (AppStore 承認済みアプリ)。

MBProgressHUD&SVProgressHUDは良いものです。

SVProgressHUD:

  1. SVProgressHUD.hプロジェクトに&を追加SVProgressHUD.mします。
  2. 次に、表示したいときに呼び出します[SVProgressHUD showWithStatus:@"Updating..." maskType:2];(あなたの場合、適切な場所に表示します)
  3. それを閉じるには、使用します[SVProgressHUD dismiss]; (あなたの場合、次のView Controllerの可能性がありますviewDidAppear

これで完了です。

于 2013-04-17T06:53:52.060 に答える