metodi NSURLConnection non più disponibili in IOS5
-
25-10-2019 - |
Domanda
Stavo guardando la classe NSURLConnection
che potrebbe essere utilizzato per stabilire una connessione di sincronizzazione o asincrona a un URL e quindi recuperare i suoi dati ... un sacco di cambiamenti sono stati fatti per questa classe con IOS 5 e ho visto hanno introdotto alcuni protocolli formali relativi alla autenticazione o il download, ma non vedo, per esempio, se il messaggio connection:didReceiveResponse:
(che è stato precedentemente inviato al delegato e che non è più disponibile è) è ancora disponibile in alcuni protocolli .. Come è possibile realizzare una connessione asincrona e recuperare, per esempio, le intestazioni HTTP non appena ricevuto la risposta? Sono sicuro che ci sia un modo migliore di utilizzare NSURLConnection
insieme al messaggio connection:didReceiveResponse:
.. metodi come stringWithContentsOfURL
faccio sempre caricare il contenuto in modo sincrono? Che cosa si usa per implementare asincrona download in tue applicazioni evitando metodi deprecati e reagire agli eventi, come _http risposta received_m ecc? Ti avvia download sincroni in attività in background, se possibile?
Soluzione
NSURLConnectionDelegate
è diventato un protocollo formale (si trattava di un protocollo informale nelle versioni precedenti). In questo protocollo, i seguenti metodi (non deprecati) sono dichiarati:
-
connection:didFailWithError:
-
connectionShouldUseCredentialStorage:
-
connection:willSendRequestForAuthenticationChallenge:
Inoltre, ci sono due subprotocols conformi alle NSURLConnectionDelegate
:
NSURLConnectionDataDelegate
viene utilizzato per i delegati che caricare i dati alla memoria, e dichiara i seguenti metodi, alcuni dei quali sono sicuro che troverete familiare:
-
connection:willSendRequest:redirectResponse:
-
connection:didReceiveResponse:
-
connection:didReceiveData:
-
connection:needNewBodyStream:
-
connection:didSendBodyData:totalBytesWritten:totalBytesExpectedToWrite:
-
connection:willCacheResponse:
-
connectionDidFinishLoading:
NSURLConnectionDownloadDelegate
viene utilizzato per i delegati che memorizzano i dati direttamente in un file su disco, e dichiara i seguenti metodi:
-
connection:didWriteData:totalBytesWritten:expectedTotalBytes:
-
connectionDidResumeDownloading:totalBytesWritten:expectedTotalBytes:
-
connectionDidFinishDownloading:destinationURL:
Come si può vedere, è comunque possibile utilizzare i vostri delegati precedenti, possibilmente con qualche piccola modifica.
Per ulteriori informazioni, vedere la iOS 4.3 a iOS 5.0 API Differenze documento NSURLConnection.h nella propria installazione Xcode locale. Quando una nuova versione SDK viene rilasciato, non è raro per la documentazione all'interno dei file di intestazione di essere più affidabile rispetto alla documentazione disponibile sulla libreria sviluppatore. Ci vuole un po 'per questi ultimi di essere up-to-date.
Altri suggerimenti
Ho appena incontrato questo stesso problema. Looks come l'invio di una richiesta asincrona è più semplificata con blocchi e NSOperationQueue
.
+ (void)sendAsynchronousRequest:(NSURLRequest *)request queue:(NSOperationQueue *)queue completionHandler:(void (^)(NSURLResponse*, NSData*, NSError*))handler
Ciò significa che il delegato è ora utilizzato solo per problemi di autenticazione e di fallimento.
NO! Essi non si limitano a utilizzare per problemi di autenticazione e di fallimento se si guarda attentamente attraverso la biblioteca di Apple.
Dal momento che l'introduzione di +(void)sendAsynchronousRequest:queue:completionHandler:
a oggetto di classe connessione NSConnection, molte cose che possono eseguire un numero metodo NSConnectionDelegate
come prima possono ora essere utilizzati in protocolli formali chiamato "NSConnectionDataDelegate
" & NSConnectionDownloadDelegate
, l'apertura di un nuovo spazio per aggiungere ulteriori funzionalità per metodi NSURLConnection
. (Da iOS5 on)
Quindi penso che è un miglioramento, non limitando il loro utilizzo.
Anche io havent trovato la documentazione sul sito web di Apple
E 'avrebbe dovuto essere disponibile qui