2011-10-18 15 views
29

Patrzyłem na klasę NSURLConnection, która może być użyta do ustanowienia połączenia synchronicznego lub asynchronicznego z adresem URL, a następnie pobrania jego danych ... wiele zmian zostało dokonanych w tej klasie z IOS 5 i ja widziałem, że wprowadzili pewne formalne protokoły związane z uwierzytelnianiem lub pobieraniem, ale nie widzę na przykład, czy wiadomość connection:didReceiveResponse: (która została wcześniej wysłana do delegata i że nie jest już dostępna) dostępne w niektórych protokołach. Jak zaimplementować połączenie asynchroniczne i pobrać nagłówki HTTP, gdy tylko otrzyma odpowiedź? Jestem pewien, że jest lepszy sposób niż używanie NSURLConnection wraz z komunikatem connection:didReceiveResponse:. Metody takie jak stringWithContentsOfURL zawsze ładują zawartość synchronicznie? Co używasz do implementacji asynchronicznych plików do pobrania w swoich aplikacjach, unikając przestarzałych metod i reagując na takie zdarzenia, jak _http response received_m etc? Czy w miarę możliwości uruchamiasz synchroniczne pobieranie w tle zadań?Metody NSURLConnection nie są już dostępne w IOS5

+0

Twoje pytanie powinno zostać podzielone na kilka pytań: w pytaniu jest pięć pytań. Moja odpowiedź dotyczy tego, co uważam za największy problem, a mianowicie pozornego usuwania metod delegowania połączeń, które były dostępne w iOS 4.3. –

Odpowiedz

68

NSURLConnectionDelegate stała się oficjalnym protokołem (był to nieformalny protokół w poprzednich wersjach). W tym protokole, następujące (nie odrzucono) metody uznane są:

  • connection:didFailWithError:
  • connectionShouldUseCredentialStorage:
  • connection:willSendRequestForAuthenticationChallenge:

Ponadto, istnieją dwa subprotocols zgodnych z NSURLConnectionDelegate:

NSURLConnectionDataDelegate jest używany dla delegatów, którzy ładują dane do pamięci i deklaruje następujące meto DS, z których niektóre Jestem pewien, że znajdziesz znajomy:

  • connection:willSendRequest:redirectResponse:
  • connection:didReceiveResponse:
  • connection:didReceiveData:
  • connection:needNewBodyStream:
  • connection:didSendBodyData:totalBytesWritten:totalBytesExpectedToWrite:
  • connection:willCacheResponse:
  • connectionDidFinishLoading:

NSURLConnectionDownloadDelegate służy do delegatów, które przechowują dane bezpośrednio do pliku na dysku, i deklaruje następujące metody:

  • connection:didWriteData:totalBytesWritten:expectedTotalBytes:
  • connectionDidResumeDownloading:totalBytesWritten:expectedTotalBytes:
  • connectionDidFinishDownloading:destinationURL:

Jak widać , nadal możesz używać swoich poprzednich delegatów, prawdopodobnie z niewielkimi modyfikacjami.

Aby uzyskać więcej informacji, zobacz iOS 4.3 to iOS 5.0 API Differences document i NSURLConnection.h w lokalnej instalacji Xcode. Po wydaniu nowej wersji SDK dokumentacja w plikach nagłówkowych jest często bardziej wiarygodna niż dokumentacja dostępna w bibliotece programisty. Trzeba trochę czasu, aby ten ostatni był aktualny.

+0

Dziękuję ... Właśnie zauważyłem, że dokumenty referencyjne nie zostały jeszcze zaktualizowane, więc dokument różnicowy API i plik nagłówkowy to dobry punkt wyjścia .. Myślałem, że widziałem gdzieś (nie mogę go teraz znaleźć ..), którzy mówią, że zazwyczaj twoje aplikacje nie powinny implementować protokołu NSURLConnectionDataDelegate ... powiedz mi, czy się mylę: jeśli chcesz zaimplementować pasek postępu pobierania, czy nie powinieneś użyć metody didReceiveData, aby zrozumieć kiedy " pobrałem trochę danych lub czy źle zrozumiałem, jak działa iReceiveData i kiedy jest wysyłane? –

+0

@Gianni Tak, '- ... didReceiveData:' jest wysyłane do delegata, aby powiadomić, że dane zostały odebrane. Oprócz przechowywania tych danych, możesz użyć go do aktualizacji paska postępu pobierania. –

+0

FYI, od 04/08/12, dokumentacja SDK 5.1 nadal nie ma kompletnego odwołania do NSURLConnectionDataDelegate (ani online, ani w SDK). –

2

Właśnie napotkałem ten sam problem. Wygląda na to, że wysłanie żądania asynchronicznego jest bardziej uproszczone dzięki blokom i NSOperationQueue.

+ (void)sendAsynchronousRequest:(NSURLRequest *)request queue:(NSOperationQueue *)queue completionHandler:(void (^)(NSURLResponse*, NSData*, NSError*))handler 

Oznacza to, że uczestnik jest teraz używany tylko do uwierzytelniania i problemów z awariami.

+0

Dziękuję, nie mogłem znaleźć tego w dokumentach referencyjnych, może wkrótce zostanie zaktualizowany. –

+1

Normalnie jest teraz zaktualizowany. Uważaj jednak, ponieważ ta metoda nie jest dostępna w systemie iOS 4.3. Podsumowując: będziesz musiał wdrożyć oba sposoby, aby być kompatybilnym z iOS 4.3 i iOS 5.0. –

2

NIE! NIE są ograniczone do użycia w celu uwierzytelnienia i problemów z błędami, jeśli przejrzysz uważnie bibliotekę Apple.

Od wprowadzenia +(void)sendAsynchronousRequest:queue:completionHandler: do NSConnection klasy obiektu, wiele rzeczy, które mogą wykonywać jak najwięcej NSConnectionDelegate sposób jak poprzednio mogą być teraz używane w protokołach formalnych zwany „NSConnectionDataDelegate” & NSConnectionDownloadDelegate, otwierając nowy pokój, aby dodać więcej funkcji do NSURLConnection metod. (od iOS5)

Uważam, że jest to poprawa, nie ograniczająca ich użycia.

Powiązane problemy