2016-05-02 11 views
1

Ich werde verrückt versuchen, herauszufinden, wie Sie den Rest meines Codes ausführen, bevor eine Sitzung dataTaskWithRequest beendet ist. Unabhängig davon, was ich mache, wird die Daten-Task erst dann wieder .resume(), wenn alles andere fertig ist. Nichts funktioniert. Keine while-Schleife verwenden. Die Aufgabe nicht in einen separaten Thread einfügen (dispatch_async). Ich bin mit meinem Latein am Ende. Um das Ganze noch schlimmer zu machen, habe ich das Gefühl, dass ich etwas Einfaches übersehe, weil es scheint, dass niemand anderes diese Frage stellt.Swift 2 Wie erzwinge ich Session-Task zu erzwingen .Resume() vor dem Fortfahren

+0

Werfen Sie einen Blick auf diesen Artikel. Ich denke, dass Sie nach dispatch_group_enter/leave suchen, um Ihr Problem zu lösen. http://commandshift.co.uk/blog/2014/03/19/using-dispatch-groups-to-wait-for-multiple-web-services/ –

+0

Siehe http://stackoverflow.com/questions/31264172/ how-can-ich-bekomme-die-daten-von-nsurlsession-sharedsession-datataskwithrequest – Moritz

Antwort

0

NSURLSession ist ein asynchrones Ladesystem. Wenn Sie es zum Starten anweisen, beginnt es, Daten in einem eigenen Thread abzurufen, und der Code wird weiterhin ausgeführt. Wenn Sie Code haben möchten, der nach ausführt, gibt die Anfrage Daten zurück, der einfachste Weg ist, diesen Code in einen Completion-Handler-Block zu setzen (durch Aufruf von dataTaskWithRequest: completionHandler:).

+0

Entschuldigung. Ich sollte klären. Ich habe die Anfrage und die Antwort innerhalb des Completion Handlers. Direkt nach dem Block habe ich task.resume() und kurz danach habe ich eine bedingte Schleife, die fortgesetzt werden sollte, bis der Status der Aufgabe .Completed ist. Das Problem besteht darin, dass die while-Schleife unendlich ausgeführt wird, da der Block erst ausgeführt wird, wenn alles andere abgeschlossen ist. Die Anforderung wird nie innerhalb der Task ausgeführt. – dbconfession

+0

Die Sitzung selbst führt normalerweise diese Abschlussblöcke in der gleichen Ausführungsschleife/Dispatch-Warteschlange aus, für die sie geplant wurden. Sie blockieren diese Ausführungsschleife, indem Sie sich in einer while-Schleife drehen. Tu das nicht. Setzen Sie den Code nach der while-Schleife stattdessen in den Complete-Handler-Block und löschen Sie die while-Schleife vollständig. Lassen Sie die Methode zurückgeben, sodass die Hauptlaufschleife inaktiv ist. Das wird nicht nur das Problem beheben, sondern wird auch viel weniger Batterie verbrauchen, da das Warten auf eine Variable zum Wechseln viel CPU-Zyklen verschwendet. – dgatwood

+0

Ok. Aber wo ist die Linie gezeichnet? Wenn Sie den Rest des Codes nach dem Abschlussblock sagen, ist das der Rest meines Codes, der viel ist. Worauf wartet das .resume(), bevor es den Thread der Aufgabe ausführt? Nach dem, was ich erlebt habe, kann ich nach dem Aufgabenblock keinen Code mehr haben, sonst wird die Aufgabe erst ausgeführt, wenn alles andere erledigt ist. – dbconfession