2016-07-11 7 views
3

Lassen Sie session ein konfiguriertes NSURLSession Objekt sein. Ein typischer Code eine Aufgabe für diese Sitzung in Swift wäre,Was bedeutet "NSURLSession API ist hoch asynchron"?

let task = session.dataTaskWithRequest(request, completionHandler: { (data: NSData!, response: NSURLResponse!, error: NSError!) -> Void in 
//my custom completion handler invocation 
}) 

Mein Zweifel ist, ist meine Gewohnheit Abschluss-Handler in einem dispatch_async Aufruf zu erstellen aufgerufen werden, um den UI-Thread nicht blockiert? Oder es muss nicht erforderlich sein, da die API inhärent asynchron ist, würde die Methode dataTaskWithRequest(_:completionHandler) kümmern?

Auch in der documentation hat die Methode keinen Abschluss-Handler-Block, wie Sie sehen können. Aber ich habe viele Tutorials mit dieser Methode gesehen !?

+0

Die 'NSURLSession'-API verfügt sowohl über die Option, Vervollständigungshandler (Blöcke/Verschlüsse) als auch Delegate-Methoden zu verwenden. Ich denke, die Optionen der Delegiertenmethode geben Ihnen eine feinere Kontrolle, aber es gibt insgesamt vier Protokolle und viele Methoden (am meisten optional), die übernommen werden können. –

+1

Der von Ihnen angegebene Link dokumentiert beide Methoden ' dataTaskWithURL (_ :)' und ' ' dataTaskWithURL (_: completionHandler:) '. Erstere erwähnt die Notwendigkeit eines Delegierten. –

+0

https://developer.apple.com/library/ios/documentation/Foundation/Reference/NSURLSession_class/index.html#//apple_ref/occ/instm/NSURLSession/dataTaskWithRequest:completionHandler: – Wain

Antwort

2

Der Beendigungshandler wird in der von Ihnen angegebenen Warteschlange oder in seiner eigenen seriellen Warteschlange ausgeführt. Wenn Sie die Hauptwarteschlange beim Erstellen der Sitzung AFAIK nicht explizit übergeben, ist die einzige Situation, in der Callbacks den Hauptthread blockieren würden, wenn Ihr Beendigungshandler explizit performSelectorOnMainThread: oder dispatch_async/ mit dispatch_get_main_thread aufruft.