webentwicklung-frage-antwort-db.com.de

nSURLConnection-Methoden für iOS5 sind veraltet

Ich versuche, eine iOS-App zu schreiben, die asynchrone Anforderungen zum Abrufen von Daten über das Netzwerk ausgibt. Es scheint, dass viele Leute die Verwendung von NSURLConnection empfehlen, und erwähnen häufig die Verbindung der Delegatenmethode: didReceiveData :.

Ich kann leider nicht für mich herausfinden, wo diese Delegiertenmethode dokumentiert ist. Zum einen ist es nicht in der Protokollreferenz für NSURLConnectionDelegate . Es ist in der NSURLConnection-Klassenreferenz aufgeführt, wurde aber anscheinend seit iOS5 nicht mehr unterstützt. In der Dokumentation wird nicht erklärt, warum es veraltet wurde oder was Entwickler stattdessen für ähnliche Funktionen verwenden sollten.

Was vermisse ich? Vieles, was ich gelesen habe, scheint zu bedeuten, dass an NSURLConnection für iOS5 große Änderungen vorgenommen wurden. Wo sind diese Änderungen dokumentiert? Ist die Dokumentation der Delegatmethoden abgeschlossen?

Vielen Dank

65
Mike Chen

Wenn Sie um die Header-Dateien herum fischen, wurde festgestellt, dass die Methoden von einem informellen Protokoll (das ein veraltetes Obj-C-Muster ist) in ein formales Delegatenprotokoll mit dem Namen NSURLConnectionDataDelegate verschoben wurde, das sich in NSURLConnection.h befindet, jedoch keine öffentliche Dokumentation enthält. 

Der Rest der Dokumentation verwendet die Methoden weiterhin wie zuvor, ich schätze, dies ist ein Versäumnis in der Dokumentation. Das heißt Die Methoden gehen (meistens) nirgendwohin, sie wurden lediglich in mehrere Protokolle gemischt und das Dokumentationsteam hat nachgelassen. Versuchen Sie, Ihr Delegat-Objekt an das entsprechende Protokoll anzupassen, und implementieren Sie die Methoden mit den Signaturen aus der Header-Datei.

47
millimoose

Die Dokumentation ist in der Tat ein Durcheinander, obwohl für NSURLConnection.h das Änderungsprotokoll von 4.3 bis 5.0 betrachtet wird:

Entfernt

Removed -[NSObject connection:canAuthenticateAgainstProtectionSpace:]
Removed -[NSObject connection:didCancelAuthenticationChallenge:]
Removed -[NSObject connection:didFailWithError:]
Removed -[NSObject connection:didReceiveAuthenticationChallenge:]
Removed -[NSObject connection:didReceiveData:]
Removed -[NSObject connection:didReceiveResponse:]
Removed -[NSObject connection:didSendBodyData:totalBytesWritten:totalBytesExpectedToWrite:]
Removed -[NSObject connection:needNewBodyStream:]
Removed -[NSObject connection:willCacheResponse:]
Removed -[NSObject connection:willSendRequest:redirectResponse:]
Removed -[NSObject connectionDidFinishLoading:]
Removed -[NSObject connectionShouldUseCredentialStorage:]
Removed NSObject(NSURLConnectionDelegate)

Hinzugefügt

Added -[NSURLConnection currentRequest]
Added -[NSURLConnection originalRequest]
Added +[NSURLConnection sendAsynchronousRequest:queue:completionHandler:]
Added -[NSURLConnection setDelegateQueue:]
Added NSURLConnectionDataDelegate
Added -[NSURLConnectionDataDelegate connection:didReceiveData:]
Added -[NSURLConnectionDataDelegate connection:didReceiveResponse:]
Added -[NSURLConnectionDataDelegate connection:didSendBodyData:totalBytesWritten:totalBytesExpectedToWrite:]
Added -[NSURLConnectionDataDelegate connection:needNewBodyStream:]
Added -[NSURLConnectionDataDelegate connection:willCacheResponse:]
Added -[NSURLConnectionDataDelegate connection:willSendRequest:redirectResponse:]
Added -[NSURLConnectionDataDelegate connectionDidFinishLoading:]
Added NSURLConnectionDelegate
Added -[NSURLConnectionDelegate connection:canAuthenticateAgainstProtectionSpace:]
Added -[NSURLConnectionDelegate connection:didCancelAuthenticationChallenge:]
Added -[NSURLConnectionDelegate connection:didFailWithError:]
Added -[NSURLConnectionDelegate connection:didReceiveAuthenticationChallenge:]
Added -[NSURLConnectionDelegate connection:willSendRequestForAuthenticationChallenge:]
Added -[NSURLConnectionDelegate connectionShouldUseCredentialStorage:]
Added NSURLConnectionDownloadDelegate
Added -[NSURLConnectionDownloadDelegate connection:didWriteData:totalBytesWritten:expectedTotalBytes:]
Added -[NSURLConnectionDownloadDelegate connectionDidFinishDownloading:destinationURL:]
Added -[NSURLConnectionDownloadDelegate connectionDidResumeDownloading:totalBytesWritten:expectedTotalBytes:]
Added NSURLConnection(NSURLConnectionQueuedLoading)

Es scheint also, dass diese Funktionen tatsächlich noch vorhanden sind. Fügen Sie einfach die Protokolle zu Ihrer @interface-Deklaration hinzu, und Sie sollten sich auf den Weg machen.

Ich habe das neue NSURLConnectionDownloadDelegate ausprobiert. Seien Sie gewarnt, dass Ihre NSURLConnectionDataDelegate-Methoden NICHT aufgerufen werden, wenn diese Methoden in Ihrem Delegaten vorhanden sind.

Ich hatte auch ein Problem beim Öffnen der destinationURL, iOS sagte mir immer wieder, dass die Datei nicht vorhanden war, obwohl die Dokumentation darauf hinweist, dass die Datei während des Methodenaufrufs garantiert vorhanden ist.

24
ekscrypto

Die Dokumentation ist ein @ $ @ # $ Chaos. Das ist die wahre Geschichte.

Die Dokumentation zu NSURLConnection, so wie sie geschrieben wurde, lässt Sie hoch und trocken.

Im ersten Teil der Dokumentation werden Sie aufgefordert, verschiedene Methoden im NSURLConnection-Protokoll (wie connection:didReceiveData:) zur Verarbeitung eingehender Daten zu verwenden. Wenn Sie auf eine dieser Methoden in der Übersicht klicken, gelangen Sie zu einer Liste mit ABGEZOGENEN METHODEN!)

Die wahre Geschichte, die ich zusammensetzen konnte, ist, dass die meisten Methoden, die früher in NSURLConnectionProtocol enthalten waren, zu einem neuen Protokoll mit dem Namen NSURLConnectionDataProtocol verschoben wurden. Leider ist dieses neue Protokoll entweder nicht dokumentiert oder nicht indiziert, sodass Sie es nicht finden können. Was ist das Gleiche.)

In anderen interessanten Nachrichten gibt es offenbar ein neues Protokoll namens NSURLConnectionDownloadDelegate. Es klingt, als würde NSURLConnection für iOS einige Funktionen hinzufügen, die in NSURLDownload in MacOS verfügbar sind. Das NSURLConnectionDownloadDelegate-Protokoll IS ist dokumentiert.

7
Duncan C

Sie würden denken, dass die Abwertung dieser Methoden von NSURLConnection eine Erklärung erfordern würde, aber ich habe noch keinen gefunden. Das Beste, was ich bisher tun konnte, ist von Apples URL Loading System Programmierhandbuch :

Um den Inhalt einer URL herunterladen zu können, muss eine Anwendung ein Delegatobjekt bereitstellen, das mindestens die folgenden Delegatmethoden implementiert: connection:didReceiveResponse:, connection:didReceiveData:, connection:didFailWithError: und connectionDidFinishLoading:

was ein informelles Protokoll impliziert.

0
Clay Bridges