2017-12-05 3 views
5

이 다소 특이한 중첩 시퀀스가있는 코드를 상속했습니다. 일반적인 패러다임은 UI를 업데이트하기 위해 기본 대기열로 단일 발송을해야합니다. 아래에 표시된 코드는 메인 큐에 대한 다른 디스패치 내의 메인 큐로의 디스패치를 ​​중첩합니다.dispatch_async (dispatch_get_main_queue()^{}) 중첩의 목적은 무엇입니까?

- (void)viewDidLoad 
{ 
// Setup some data 
// Adjust UI 

dispatch_async(myBackgroundQueue, ^{ 
    while(Do_some_time_consuming_work) { 

    // Time consuming work goes here 

    if (things_are_going_slowly) { 

     dispatch_async(dispatch_get_main_queue(), ^{ // <- one of these two seems redundant 
      dispatch_async(dispatch_get_main_queue(), ^{ // <- one of these two seems redundant 

      stillWorkingLabel.hidden = NO; //Let user know the work is still ongoing 
      }); 
     }); 
    ) 

    // Finish time-consuming work 
    } 

    }); 

} 

중첩의 목적은 무엇입니까? dispatch_async(dispatch_get_main_queue()? 이 중첩 된 시퀀스는 앱의 여러 위치에 표시됩니다. 메인 큐에 단 하나의 디스패치 만 필요하다는 것은 나에게 보인다.

여기 관련된 주제에 관한 모든 질문을 Google 검색을 통해 읽었지만 두 가지 동일한 발송을 중첩하는 제안을 찾지 못한 사람은 없습니다.

위의 예제와 코드의 다른 위치에서 예상대로 UI를 업데이트하면 앱이 잘 작동합니다.

대부분의 앱 코드는 위의 구성표의 중첩되지 않은 버전을 사용하며, 물론 정상적으로 작동합니다.

이 중첩 호출을 단일 발송으로 바꾸고 싶지만 여기에 뭔가 빠졌을 수도 있습니다. 어떤 조언을 주시면 감사하겠습니다.

답변

2

나는이 일을 한 가지 이점으로 생각할 수 없으며, 그렇게 생각하지 않을 수 있습니다. 이는 내부 클로저의 실행을 지연시킬뿐만 아니라 소량의 추가 리소스를 사용합니다. (그것은 작업 항목이 실행되기 전에 이벤트 루프를 통해 앱이 최소 2 회 통과하도록 강제합니다.)

중첩 된 호출을 제거하는 것이 올바른 일이라고 생각합니다. 이해가되지 않는 주요 두 dispatch_queues을 중첩

0

, 직진 방법은 그

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

// perform long task here 

dispatch_async(dispatch_get_main_queue(), ^(){ 

    //Add method, task you want perform on mainQueue 
//Control UIView, IBOutlet all here 

}); }); 
관련 문제