2017-12-05 119 views
5

Odziedziczyłem kod, który ma dość nietypową sekwencję zagnieżdżoną. Zwykły paradygmat będzie miał pojedynczą dyspozycję do głównej kolejki, aby zaktualizować interfejs użytkownika. Przedstawiony poniżej kod umieszcza wysyłkę do głównej kolejki w ramach innej wysyłki do głównej kolejki.Jaki jest cel zagnieżdżania 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 
    } 

    }); 

} 

Jaki jest cel zagnieżdżania dispatch_async(dispatch_get_main_queue()? Ta sekwencja zagnieżdżona pojawia się w kilku miejscach w aplikacji. Wydaje mi się, że potrzebna jest tylko jedna przesyłka do głównej kolejki.

Myślę, że przeczytałem wszystkie istotne pytania dotyczące pokrewnych tematów tutaj i przez wyszukiwarkę Google, ale nie znalazłem nikogo sugerującego zagnieżdżenie dwóch identycznych wysyłek.

Aplikacja działa dobrze, a interfejs użytkownika aktualizuje się zgodnie z oczekiwaniami w powyższym przykładzie oraz w innych miejscach kodu.

Większość kodu aplikacji używa zwykłej, nie zagnieżdżonej wersji powyższego schematu, i oczywiście działa dobrze.

Jestem skłonny po prostu zastąpić te połączenia zagnieżdżone pojedynczą wysyłką, ale być może czegoś tutaj brakuje. Każda rada byłaby doceniona.

Odpowiedz

2

Nie mogę myśleć o jednej korzyści, aby to zrobić i mogę myśleć o powodach, aby tego nie robić. Spowoduje to opóźnienie realizacji wewnętrznego zamknięcia, a także pobranie niewielkiej ilości dodatkowych zasobów. (Zmusza aplikację do przejścia przez co najmniej 2 przebiegi przez pętlę zdarzeń przed wykonaniem elementu pracy.)

Myślę, że usunięcie zagnieżdżonych połączeń jest słuszne.

0

Zagnieżdżanie dwa dispatch_queues dla głównego nie ma sensu, prosta droga naprzód jest

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 

}); });