web-dev-qa-db-fra.com

méthodes iOS5 NSURLConnection obsolètes

J'essaie d'écrire une application iOS qui crée des demandes asynchrones pour obtenir des données sur le réseau. Il semble que beaucoup de gens recommandent d'utiliser NSURLConnection pour cela et mentionnent fréquemment la connexion de méthode déléguée: didReceiveData :.

Malheureusement, je ne peux pas pour toute la vie découvrir où cette méthode de délégué est documentée. D'une part, il ne se trouve pas dans la référence de protocole pour NSURLConnectionDelegate . Il est répertorié dans la référence de classe NSURLConnection , mais est apparemment obsolète depuis iOS5. La documentation n'explique pas pourquoi il est déconseillé, ni ce que les développeurs devraient utiliser pour obtenir des fonctionnalités similaires.

Qu'est-ce que je rate? Une grande partie de ce que j'ai lu semble impliquer que d'importants changements ont été apportés à NSURLConnection pour iOS5. Où ces changements sont-ils documentés? La documentation des méthodes de délégué est-elle complète?

Merci

65
Mike Chen

Explorer les fichiers d'en-tête m'indique que les méthodes ont été déplacées d'un protocole informel (qui est un modèle Obj-C obsolète) vers un protocole de délégué formel appelé NSURLConnectionDataDelegate qui se trouve dans NSURLConnection.h, mais ne possède pas de documentation publique. 

Le reste de la documentation continue à utiliser les méthodes comme auparavant, donc je suppose que c'est une omission dans la documentation. C'est à dire. les méthodes (la plupart du temps) ne vont nulle part, elles ont simplement été remaniées en plusieurs protocoles et l'équipe de documentation s'est relâchée. Essayez de rendre votre objet délégué conforme au protocole approprié et implémentez les méthodes avec les signatures du fichier d'en-tête.

47
millimoose

La documentation est en effet un désordre, bien que regardant le changelog de 4.3 à 5.0 pour NSURLConnection.h:

Enlevé

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)

Ajoutée

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)

Il semble donc que ces fonctions sont toujours là. Ajoutez simplement les protocoles à votre déclaration @interface et vous devriez être prêt à partir.

J'ai essayé le nouveau NSURLConnectionDownloadDelegate, sachez que si ces méthodes sont présentes dans votre délégué, vos méthodes NSURLConnectionDataDelegate NE seront PAS appelées.

J'ai également eu un problème en ouvrant l'URL de destination, iOS n'arrêtant pas de me dire que le fichier n'existait pas, bien que la documentation indique qu'il est garanti que le fichier existe pendant l'appel de la méthode.

24
ekscrypto

La documentation est un @ $ @ # $ mess. C'est la vraie histoire.

La documentation sur NSURLConnection, telle que rédigée, vous laisse au sec.

La première partie de la documentation vous recommande d’utiliser différentes méthodes du protocole NSURLConnection (comme connection:didReceiveData:) pour gérer les données entrantes. Si vous cliquez sur l’une de ces méthodes dans l’aperçu, vous obtiendrez une liste de méthodes décomposées!

La vraie histoire que j'ai pu reconstituer est que la plupart des méthodes anciennement dans NSURLConnectionProtocol ont été déplacées vers un nouveau protocole appelé NSURLConnectionDataProtocol. Malheureusement, ce nouveau protocole n'est pas documenté ou n'est pas indexé, vous ne pouvez donc pas le trouver. Ce qui revient à la même chose.)

Dans d'autres nouvelles intéressantes, il y a apparemment un nouveau protocole appelé NSURLConnectionDownloadDelegate. On dirait que NSURLConnection pour iOS ajoute certaines des fonctionnalités disponibles dans NSURLDownload sous MacOS. Le protocole NSURLConnectionDownloadDelegate IS est documenté.

7
Duncan C

Vous penseriez peut-être que désapprouver ces méthodes de NSURLConnection justifierait un explicateur, mais je n’en ai pas encore trouvé. Le mieux que j'ai pu faire jusqu'à présent provient du Guide de programmation du système de chargement URL d'Apple :

Afin de télécharger le contenu d'une URL, une application doit fournir un objet délégué qui, au minimum, implémente les méthodes de délégation suivantes: connection:didReceiveResponse:, connection:didReceiveData:, connection:didFailWithError: et connectionDidFinishLoading:

ce qui implique un protocole informel.

0
Clay Bridges