2013-05-16 21 views
30

Co oznacza ten fragment kodu?dispatch_async i blok w iOS

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     TMBaseParser *parser=[[TMBaseParser alloc] init]; 
     parser.delegate=self; 
     NSString *post =nil; 
     NSData *postData = [post dataUsingEncoding:NSUTF8StringEncoding]; 
     [parser parseForServiceType:TMServiceCategories postdata:postData]; 
    }); 

proszę wyjaśnić to briefly.Thanks

+0

Ten kod wygląda dziwnie: najpierw 'Post' jest ustawione na' zerowe. W następnej linii wiadomość jest wysyłana do 'posta '. To nic nie da, prawda? – Maarten

+0

Jeśli post == zero, wtedy [post dataUsingEncoding: NSUTF8StringEncoding] również zwróci zero. – ahwulf

Odpowiedz

95

Fragment kodu w

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

}); 

prowadzony jest asynchronicznie w wątku tła. Dzieje się tak, ponieważ przetwarzanie danych może być czasochłonnym zadaniem i może zablokować główny wątek, który zatrzyma wszystkie animacje, a aplikacja nie będzie reagować.

Jeśli chcesz dowiedzieć się więcej, przeczytaj dokumentację Apple na Grand Central Dispatch

+0

Ładne wyjaśnienie Marcin !!! – iAnurag

2

czyli blok Grand Central Dispatch.

  1. dispatch_async to wywołanie do uruchomienia w innej kolejce.
  2. dispatch_get_global_queue to wywołanie, aby uzyskać określoną kolejkę o pożądanej charakterystyce. Na przykład kod może mieć niski priorytet w DISPATCH_QUEUE_PRIORITY_BACKGORUND.
  3. Wewnątrz bloku kod nic nie robi. Post jest ustawiony na zero. Następnie wiadomość jest wysyłana do zera "dataUsingEncoding". Objective C drops all calls to nil. Wreszcie parser jest wysyłany "zero" postData.
  4. W najlepszym razie to nic nie da. W najgorszym przypadku nastąpi zanik danych zerowych parsera.
5

Jeśli powyższe fragmenty kodu nie działa wtedy, spróbuj tego:

Objective-C:

dispatch_async(dispatch_get_main_queue(), ^{ 

}); 

aktualizacje interfejsu powinien być zawsze wykonywany od głównej kolejki. Symbol "^" oznacza początek bloku.

Swift 3:

DispatchQueue.global(qos: .background).async { 
    print("This is run on the background queue") 

    DispatchQueue.main.async { 
     print("This is run on the main queue, after the previous code in outer block") 
    } 
} 
+0

Co robi '',^''? A dla jakiej szybkiej wersji jest to ten przykład? – eonist

+0

@GitSyncApp, zaktualizowałem swoją odpowiedź. Proszę sprawdzić ... :) –

+0

wygląda (wątek w swift 3 jest znacznie czyściejszy niż wcześniej) – eonist