bearbeiten: Ich muss eine Datei asynchron von einem iPhone in einen serverseitigen Python-Prozess hochladen. Ich möchte die Anfrage asynchron ausführen, damit ich eine ausgelastete Animation anzeigen kann, während sie arbeitet.
Die Anfrage muss den Benutzernamen, das Passwort und die Datei als 'multipart / form-data' enthalten.
Ich kann es synchron mit NSURLConnection mit dem Code wie folgt aussehen:
%Vor%// Bauanfrage
%Vor%Wenn ich dies jedoch asynchron mit NSURLSession versuche, scheint es nicht richtig zu funktionieren. Der Code mit NSURLSession sieht folgendermaßen aus:
%Vor%Ich habe Mühe, zu sehen, was ich anders mache, obwohl es scheint, dass es funktionieren sollte.
Verwendet NSURLSession den richtigen Weg für asynchrone Anfragen? und ich bin neu in NSURLSession, also muss ich meine NSURLMutableRequest für NSURLSession-Anfragen statt NSURLConnection ändern?
Vielen Dank im Voraus für jede Hilfe!
Sie haben Recht, wenn Sie Ihre Anfrage nur asynchron machen möchten, sollten Sie sendSynchronousRequest
zurückziehen. Während wir einmal sendAsynchronousRequest
empfohlen hätten, effektiv iOS 9, ist NSURLConnection
formal veraltet und man sollte NSURLSession
bevorzugen.
Sobald Sie NSURLSession
verwenden, werden Sie möglicherweise dazu verleitet. Zum Beispiel kann man [NSURLSessionConfiguration backgroundSessionConfiguration:]
verwenden und dann den Fortschritt hochladen, selbst nachdem die App in den Hintergrund getreten ist. (Sie müssen ein paar Delegate Methoden schreiben, aus Gründen der Einfachheit bin ich mit einem einfachen Vordergrund-Upload unten geblieben.) Es ist nur eine Frage Ihrer Geschäftsanforderungen, die die neuen NSURLSession
Funktionen gegenüber der iOS 7+ Einschränkung ausgleichen mit sich bringt.
Übrigens ist jede Konversation über Netzwerkanfragen in iOS / MacOS wahrscheinlich unvollständig, ohne einen Verweis auf AFNetworking . Es vereinfacht die Erstellung dieser mehrteiligen Anfragen erheblich und verdient definitiv eine Untersuchung. Sie haben auch NSURLSession
support (aber ich habe ihre Session-Wrapper nicht benutzt, kann also nicht damit sprechen). Aber AFNetworking ist zweifellos Ihre Aufmerksamkeit wert. Sie können einige der Vorteile der Delegate-Base-API genießen (z. B. Fortschrittsaktualisierungen, abbrechbare Anfragen, Abhängigkeiten zwischen Vorgängen usw.) und weitaus bessere Kontrolle bieten, als mit Komfortmethoden (wie sendSynchronousRequest
), ohne jedoch durchzuziehen die Unkräuter der Delegiertenmethoden selbst.
Unabhängig davon, ob Sie wirklich daran interessiert sind, Uploads mit NSURLSession
durchzuführen, siehe unten.
Wenn Sie über NSURLSession
hochladen möchten, ist es eine leichte Verschiebung des Denkens, nämlich die Konfiguration der Anfrage (und ihrer Header) in der NSMutableURLRequest
von der Erstellung des Hauptteils der Anfrage ( was Sie jetzt bei der Instantiierung von NSURLSessionUploadTask
angeben). Der Hauptteil der Anfrage, die Sie nun als Teil der Upload-Aufgabe angeben, kann entweder ein NSData
, eine Datei oder ein Stream sein (ich verwende unten eine NSData
, weil wir eine mehrteilige Anfrage erstellen):
Und die Erstellung der NSData
, die gesendet wird, ähnelt Ihrem bestehenden Code:
Sie haben die Grenze und den Mime-Typ fest codiert, was gut ist, aber das obige geschieht mit den folgenden Methoden:
%Vor%Tags und Links ios nsurlconnection asynchronous nsurlsession