Zurückgeben von NSData aus dem NSURLSessionDataTask-Beendigungshandler

8

Ich versuche eine einfache Klasse zu erstellen, mit der ich einen Post-Web-Service aufrufen kann.

Alles funktioniert perfekt, außer dass ich NSData nicht zurückgeben kann.

Das ist mein Code:

%Vor%

Bitte beachten Sie, dass ich //return data habe, aber es gibt mir diesen Fehler

%Vor%

Meine Frage ist:

  1. Ist mein Weg gut oder wird es mir in der Zukunft Probleme bereiten? Ich habe kein Bild zum Herunterladen und ich habe nichts zum Hochladen, ich muss nur einfache String-Daten senden und simpe string-Daten erhalten. Oder wird es besser sein, dass dieser Code in jeder Funktion unabhängig ist?

  2. Wie kann ich die Daten bitte zurücksenden?

Carol Smith 20.07.2014, 15:05
quelle

2 Antworten

7

Sie können die Daten nicht einfach zurückgeben (weil NSURLSessionDataTask asynchron ausgeführt wird). Wahrscheinlich möchten Sie Ihr eigenes Abschlussblockmuster verwenden, ähnlich dem completionHandler der Methode dataTaskWithRequest .

Sie würden also Ihrer Methode einen eigenen Blockparameter hinzufügen, den Sie aus dataTaskWithRequest der Methode completionHandler aufrufen:

%Vor%

Hinweis: Ich denke, es ist gut, den Verweis NSURLSessionDataTask zurückzugeben, damit (a) der Aufrufer sicherstellen kann, dass der Datentask erfolgreich erstellt wurde; und (b) Sie haben den Verweis NSURLSessionTask , mit dem Sie die Aufgabe abbrechen können, falls Sie zu einem späteren Zeitpunkt die Anfrage aus irgendeinem Grund abbrechen möchten (z. B. wenn der Benutzer den View Controller aus der Liste entfernt Anfrage wurde ausgestellt).

Wie auch immer, du würdest das dann mit aufrufen:

%Vor%

Sie fragen:

  

Ist mein Weg gut oder wird es mir in der Zukunft Probleme bereiten? Ich habe kein [ein] Bild zum Herunterladen und ich habe nichts zum Hochladen, ich muss nur [einige] einfache Zeichenfolgendaten senden und [einfache] Zeichenfolgendaten empfangen. Oder wird es besser sein, dass dieser Code in jeder Funktion unabhängig ist?

Wenn Sie einfache String-Daten zurück erhalten, würde ich vorschlagen, Ihre Antwort im JSON-Format zu verfassen und dann den Abschlussblock in postCall verwenden NSJSONSerialization , um die Antwort zu extrahieren. Die Verwendung von JSON erleichtert es der App, zwischen einer erfolgreichen Antwort und einer Vielzahl von serverbezogenen Problemen zu unterscheiden, die ebenfalls Zeichenfolgenantworten zurückgeben können.

Nehmen wir an, Sie haben Ihren Servercode so geändert, dass eine Antwort wie folgt zurückgegeben wird:

%Vor%

Dann könnten Sie postCall ändern, um diese Antwort wie folgt zu analysieren:

%Vor%

In Bezug auf Ihre zugrundeliegende Frage, ob eine Methode wie postCall sinnvoll ist, ja, ich denke, es ist absolut sinnvoll, die Details der Erstellung der Anfrage in einer einzigen Methode zu beschreiben. Meine kleine Einschränkung in Ihrer Implementierung war Ihre Entscheidung, sie zu einer Klassenmethode anstelle einer Instanzmethode zu machen. Sie erstellen derzeit eine neue NSURLSession für jede Anfrage. Ich würde vorschlagen, postCall eine Instanzmethode (von einem Singleton, wenn Sie wollen) zu machen und dann die Sitzung als eine Klasseneigenschaft zu speichern, die Sie einmal festlegen und dann bei nachfolgenden Abfragen wiederverwenden.

    
Rob 20.07.2014 15:38
quelle
1

Sie sollten eine Blockmethode verwenden.

Definieren Sie zuerst einen Block

%Vor%

Verwenden Sie die folgende Methode

%Vor%     
Sunny Shah 20.07.2014 17:24
quelle

Tags und Links