2011-10-18 5 views
29

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

+0

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. –

risposta

68

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.

+0

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? –

+0

@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. –

+0

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). –

2

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.

+0

Grazie, non sono riuscito a trovarlo nei documenti di riferimento, forse sarà presto aggiornato. –

+1

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. –

2

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.