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
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.
La documentation est en effet un désordre, bien que regardant le changelog de 4.3 à 5.0 pour NSURLConnection.h:
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)
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.
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é.
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:
etconnectionDidFinishLoading:
ce qui implique un protocole informel.