2013-05-16 7 views
30

Was dieser Code bedeuten?dispatch_async und block in 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]; 
    }); 

bitte erklären briefly.Thanks

+0

Dieser Code sieht seltsam: erste 'Post' auf' nil' gesetzt. In der nächsten Zeile wird eine Nachricht an "post" gesendet. Das wird nichts machen, oder? – Maarten

+0

Wenn post == nil, dann gibt [post dataUsingEncoding: NSUTF8StringEncoding] auch nil zurück. – ahwulf

Antwort

95

Das Stück Code in

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

}); 

laufen asynchron auf einem Hintergrund-Thread. Dies geschieht, da das Parsen von Daten eine zeitaufwendige Aufgabe ist und den Haupt-Thread blockieren könnte, der alle Animationen stoppen würde und die Anwendung nicht reagieren würde.

Wenn Sie möchten, um mehr zu erfahren, lesen Sie Dokumentation von Apple auf Grand Central Dispatch

+0

Schöne Erklärung Marcin !!! – iAnurag

2

Das ist ein Grand Central Dispatch-Block ist.

  1. dispatch_async ist ein Aufruf, der in einer anderen Warteschlange ausgeführt wird.
  2. dispatch_get_global_queue ist ein Aufruf, um eine bestimmte Warteschlange mit den gewünschten Merkmalen zu erhalten. Zum Beispiel könnte der Code mit einer niedrigen Priorität auf dem DISPATCH_QUEUE_PRIORITY_BACKGORUND ausgeführt werden.
  3. Innerhalb des Blocks macht der Code nichts. Post wird auf Null gesetzt. Dann wird eine Nachricht an nil "dataUsingEncoding" gesendet. Objective C drops all calls to nil. Schließlich wird der Parser "nil" postData gesendet.
  4. Im besten Fall wird dies nichts tun. Im schlimmsten Fall wird der Parser nicht mit Daten abstürzen.
5

Wenn der oben genannte Code-Schnipsel dann nicht funktioniert, versuchen Sie dies:

Objective-C:

dispatch_async(dispatch_get_main_queue(), ^{ 

}); 

UI Updates sollten immer von der Hauptwarteschlange. Das "^" Symbol zeigt einen Start eines Blocks an.

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

Was macht das '',^''? Und für welche schnelle Version ist dieses Beispiel? – eonist

+0

@ GitSyncApp, ich habe meine Antwort aktualisiert. Bitte überprüfen Sie es ... :) –

+0

sieht (threading in swift 3 ist viel sauberer als zuvor) – eonist

Verwandte Themen