1

ブロック内でいくつかのネットワーク呼び出しを実行しているときに、アクティビティ インジケーターを表示したいと考えていますdispatch_group_asyc。ただし、アクティビティ インジケーターは、ブロックが終了したときにのみ表示されます。dispatch_group_t他のタスクを実行する前に、ネットワーク呼び出しの結果を取得する必要があるため、 を作成しています。これは私のコードの簡略版です:

- (BOOL)doNetCall
{
  [activityIndicator startAnimating];

  __block BOOL netResult = NO;

  dispatch_queue_t queue = dispatch_queue_create(netQueue, NULL);
  dispatch_group_t group = dispatch_group_create();
  dispatch_group_async(group,queue,^{
    netResult = [service queryService];
  });

  dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
  dispatch_release(group);
  dispatch_release(queue);

  [activityIndicator stopAnimating];

  if (netResult) {  
    // Perform some tasks
  }
  else {
    [self showAlertView];
  }

  return netResult;
}

私は何を間違っていますか?ありがとう!

編集:取得した結果を返すために、ブロックが終了するまで待機するメソッドが必要です

4

2 に答える 2

4

アクティビティ インジケーターは次のように使用する必要があります。

[activityIndicator startAnimating];
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
    // Do something...
    dispatch_async(dispatch_get_main_queue(), ^{
        [activityIndicator stopAnimating];
    });
});

を使用している場合はgroup、コードを少し書き直してください。

于 2013-07-03T15:15:00.673 に答える
0

あなたがしていることにディスパッチグループは必要ないようです。これを試して:

- (void)buttonClicked {
    [activityIndicator startAnimating];

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        BOOL netResult = [service queryService];

        dispatch_async(dispatch_get_main_queue(), ^{
            [activityIndicator stopAnimating];

            if (netResult) {
                // perform some tasks
            } else {
                // show alert
            }
        });
    });
}

キューがある場合は、呼び出しをdispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)独自のキューに置き換えます。

于 2013-07-03T15:13:26.823 に答える