Stavo osservando la classe NSURLConnection
che potrebbe essere utilizzata per stabilire una sincronizzazione o una connessione asincrona con un URL e quindi recuperare i suoi dati ... sono state apportate molte modifiche a questa classe con IOS 5 e ho visto che hanno introdotto alcuni protocolli formali relativi all'autenticazione o al download, ma non vedo, ad esempio, se il messaggio connection:didReceiveResponse:
(che è stato precedentemente inviato al delegato e che non è più disponibile) è ancora disponibile in alcuni protocolli. Come implementare una connessione asincrona e recuperare, ad esempio, le intestazioni HTTP non appena viene ricevuta la risposta? Sono sicuro che c'è un modo migliore di usare NSURLConnection
insieme al messaggio connection:didReceiveResponse:
.. metodi come stringWithContentsOfURL
fanno sempre caricare il contenuto in modo sincrono? Che cosa usi per implementare download asincroni nelle tue app evitando metodi deprecati e reagendo a eventi come _http response received_m etc? Lanci download sincroni nelle attività in background, se possibile?Metodi NSURLConnection non più disponibili in IOS5
risposta
NSURLConnectionDelegate
è diventato un protocollo formale (era un protocollo informale nelle versioni precedenti). In questo protocollo, i seguenti metodi (non ritirate) vengono dichiarate:
connection:didFailWithError:
connectionShouldUseCredentialStorage:
connection:willSendRequestForAuthenticationChallenge:
Inoltre, ci sono due subprotocols conformi a NSURLConnectionDelegate
:
NSURLConnectionDataDelegate
viene utilizzato per i delegati che caricano i dati in memoria e dichiara il seguente metho ds, 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 , puoi ancora utilizzare i tuoi delegati precedenti, eventualmente con alcune modifiche minori.
Per ulteriori informazioni, vedere iOS 4.3 to iOS 5.0 API Differences document e NSURLConnection.h nell'installazione locale Xcode. Quando viene rilasciata una nuova versione dell'SDK, non è raro che la documentazione all'interno dei file dell'intestazione sia più affidabile della documentazione disponibile nella libreria degli sviluppatori. Ci vuole un po 'prima che quest'ultimo sia aggiornato.
Grazie ... Ho appena visto che i documenti di riferimento non sono ancora stati aggiornati, quindi il doc di differenza API e il file di intestazione sono un buon punto di partenza .. Ho pensato di averlo visto da qualche parte (non riesco a trovarlo ora ..) che i documenti dicono che di solito le tue app non devono implementare il protocollo NSURLConnectionDataDelegate ... dimmi se ho torto: se hai bisogno di implementare una sorta di barra di avanzamento del download, non dovresti usare didReceiveData per capire quando tu? Ho scaricato un po 'di dati o ho frainteso come funziona Receceive Data e quando viene inviato? –
@Gianni Sì, '- ... didReceiveData:' viene inviato al delegato per notificare che i dati sono stati ricevuti. Oltre a memorizzare questi dati, puoi utilizzarli per aggiornare una barra di avanzamento del download. –
FYI, a partire dal 04/08/12, la documentazione 5.1 SDK non ha ancora un riferimento completo su NSURLConnectionDataDelegate (né online né all'interno dell'SDK). –
Ho appena incontrato lo stesso problema. Sembra che l'invio di una richiesta asincrona sia più semplificato con i 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 errore.
Grazie, non sono riuscito a trovarlo nei documenti di riferimento, forse sarà presto aggiornato. –
Normalmente è ora aggiornato. Attenzione però, perché questo metodo non è disponibile su iOS 4.3. In sintesi: è necessario implementare entrambi i modi per essere compatibili con iOS 4.3 e iOS 5.0. –
Anche Io ho mai trovato la documentazione sul sito web Apple
Avrebbe dovuto essere disponibile qui
NO! Non sono limitati a utilizzare per problemi di autenticazione e di errore se si guarda attentamente attraverso la libreria di Apple.
Dall'introduzione +(void)sendAsynchronousRequest:queue:completionHandler:
a oggetto di classe connessione NSConnection, molte cose che possono eseguire un numero NSConnectionDelegate
metodo come prima possono ora essere utilizzati in protocolli formali chiamato "NSConnectionDataDelegate
" & NSConnectionDownloadDelegate
, l'apertura di un nuovo spazio per aggiungere ulteriori funzionalità per NSURLConnection
metodi. (da iOS5 in poi)
Quindi penso che sia un miglioramento, non limitante il loro utilizzo.
Così com'è, la domanda dovrebbe essere suddivisa in più domande: ci sono potenzialmente cinque domande all'interno della domanda. La mia risposta si rivolge a ciò che ritengo essere il vostro più grande problema, ovvero l'apparente rimozione dei metodi di delega della connessione disponibili in iOS 4.3. –