2012-07-18 14 views
6

Tak więc, po uruchomieniu bloku, muszę mieć możliwość uruchomienia segue. Mam blok, który wykonuje niektóre rzeczy JSON i muszę wiedzieć kiedy to się skończyło.sposób sprawdzenia, czy blok dispatch_async zakończył działanie

Mam kolejkę, którą nazwałem json_queue.

jsonQueue = dispatch_queue_create("com.jaboston.jsonQueue", NULL); 

Mam następnie blok dispatch_async z tej składni:

dispatch_async(jsonQueue, ^{ 
    [self doSomeJSON]; 
    [self performSegueWithIdentifier:@"modaltomenu" sender:self]; 
    }); 

To nie pozwala mi wykonywać linię: "[self performSegueWithIdentifier: @" modaltomenu "nadawca: self];"

Próbowano uzyskać blokadę wstęgi z wątku innego niż główny wątek lub wątek internetowy. Może to być wynikiem wywołania UIKit z wątku dodatkowego. Rozbijanie teraz ...

Gdzie mogę sprawdzić, kiedy wątek wykonał swoją brudną robotę, abym mógł zadzwonić na adres?

Dziękuję cudowni ludzie.

PS: Piwo i ups i misie i kwiaty dla tego, kto może pomóc < 3.

Odpowiedz

26

Należy zadzwonić metody UI tylko na wątku głównym. Spróbuj wysłać performSegueWithIdentifier: w głównej kolejce:

dispatch_async(jsonQueue, ^{ 
    [self doSomeJSON]; 
    dispatch_sync(dispatch_get_main_queue(), ^{ 
     [self performSegueWithIdentifier:@"modaltomenu" sender:self]; 
    }); 
}); 
+0

ty masz upvote i piwo. (to jest odpowiedź, której szukałem!). Całkowicie zapomniałem, że w każdej chwili możesz wrócić do mainqueue. znakomity. – jimbob

+0

Jestem nowy w tych rzeczach. Dlaczego jest to lepsze niż użycie performSelectorOnMainThread wewnątrz bloku? –

+0

@jimbob Powinienem wspomnieć, że używanie 'dispatch_sync' zamiast' dispatch_async' w trzecim wierszu byłoby w tym przypadku lepsze (ja to zredagowałem). Ten wzór jest zalecany w materiale wideo WWDC2010 Session 206. @ranReloaded Korzystanie z innego bloku jest wygodniejsze, ponieważ nie trzeba tworzyć zupełnie nowej metody dla tak prostego zadania, a co najlepsze, można uzyskać dostęp do każdej zmiennej w zakresie definicji bloku. – Johnnywho

5
dispatch_async(jsonQueue, ^{ 
     [self doSomeJSON]; 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      [self performSegueWithIdentifier:@"modaltomenu" sender:self]; 
      //Finished with async block 

     }); 
    }); 
+0

Głosowałem za nią, ponieważ jest to również poprawna odpowiedź, ale niestety ten facet odpowiedział z dodatkowymi dodatkowymi informacjami. Ale bardzo dziękuję! – jimbob

Powiązane problemy