1

我想在dispatch_group_asyc塊中執行某些網絡調用時顯示一個活動指示器。但活動指示器僅在塊結束時顯示。我正在創建dispatch_group_t,因爲我需要在執行其他任務之前獲取網絡呼叫的結果。這是我的代碼的簡化版本:在iOS中創建一個調度組時,動畫指示器不會動畫

- (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; 
} 

我在做什麼錯?謝謝!

編輯:我需要的方法等待,直到塊結束才能返回結果我得到

+1

您正在通過調用'dispatch_group_wait'來阻塞主線程。這真是太糟了。不要在主線程上做你正在做的事情。 – rmaddy

+0

你爲什麼用這個派遣組? – rmaddy

+0

@rmaddy對不起,我的錯,這個代碼是在異步任務完成時應該返回一個值的方法。我編輯了我的問題 – AppsDev

回答

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)。如果您使用group,只是重寫代碼有點

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

4

你應該以這種方式使用活動的指標。