2009-08-10 18 views
10

Używam obiektu NSMutableURLRequest do łączenia się z witryną sieci Web, aby uzyskać odpowiedź JSON. Robię to, generując żądanie, a następnie używając NSURLConnection z delegatem self do obsługi połączenia asynchronicznego. I zostały wdrożone wszystkie normalne metody Delegat:Obsługa rekordu NSURLRequest z limitem czasu podczas używania delegata

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 
- (void)connectionDidFinishLoading:(NSURLConnection *)connection 

wszystko działa doskonale pobierania danych z powrotem do czynienia z wszelkich błędów, które występują itp Jednak z limitu czasu na NSURLRequest ustawiony na 10 sekund, nie wydaje aby zostać wywołanym tymi metodami (spodziewałem się wywołania metody didFailWithError). Siedzi tam na zawsze i nie mam powiadomienia, że ​​upłynął limit czasu.

Czytanie dokumentów API iPhone'a Nie widzę żadnej wzmianki o tym, co powinno się zdarzyć po przekroczeniu limitu czasu, tylko że można ustawić wartość limitu czasu. Co powinno się stać? Nie widziałem żadnych innych metod delegowania w API, które mogłyby pomóc. Nie muszę ręcznie sprawdzać przekroczeń czasu, prawda? Czy limity czasu są dostępne tylko dla żądań synchronicznych?

+0

Zgadzam się z Coreyem, że powinienem go pobrać w metodzie didDailWithError, ale nigdy nie zostanie wywołany. Zarówno punkty przerwania, jak i logi w tej metodzie pokazują, że nie jest on wywoływany z powodu przekroczenia limitu czasu. – Parrots

+1

Aby uzyskać więcej kontekstu, zwróć to robi różnicę, Używam metody omawianej w odpowiedzi na http://stackoverflow.com/questions/332276/managing-multiple-asynchronous-nsurlconnection-connections, aby śledzić połączenia I mieć wybitne. – Parrots

+0

Wygląda na to, że mógł to być błąd w pakiecie beta SDK 3.0, ponieważ po wydaniu wersji końcowej działało zgodnie z oczekiwaniami. – Parrots

Odpowiedz

12

Twój limit czasu otrzymania w tej metodzie:

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 
+0

Jak można przetestować pod kątem limitu czasu? To wydaje się być ogólnym narzędziem obsługi błędów. – devios1

+14

Znaleziono: 'error.code == NSURLErrorTimedOut' – devios1

1

Umieścić niektóre instrukcje dziennika w każdej metodzie i sprawdzić, co dają. Za każdym razem, gdy upłynie limit czasu, na konsoli pojawi się powiadomienie o przekroczeniu limitu czasu. Otrzymuję to powiadomienie. Sprawdź swój kod i jeśli nadal masz problemy, daj nam znać.

4

u będzie BR otrzymaniu takiego rodzaju iofo:

w omieszkał z

error: Error Domain=NSURLErrorDomain Code=-1001 UserInfo=0xed4870 "timed out"

+0

Uwaga 'NSURLErrorTimedOut = -1001' – devios1

3

Zachowanie timeout nieco ekscentryczne , zobacz this thread na forach programistów Apple.

+1

Ten wątek jest świetny! Dzięki! Pamiętaj, że wątek zawiera odwołanie do https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Miscellaneous/Foundation_Constants/Reference/reference.html, które zawiera listę wszystkich błędów w NSURLErrorDomain –

1

Co zrobiłem było tak:

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{ 
    if (error.code == -1001){ 
     [self showTimeoutAlert];//My method to show dialog with timeout message. 
    } else { 
     [self showInvalidURLAlert];//My method to show dialog with bad URL message. 
    } 
} 

Jak powiedział przed -1001 jest limit czasu, w innych testach mam -1003 (za złą URL lub bez dostępna połączenia).

Starałem się traktować limit czasu, więc cokolwiek innego traktowałem jako zły URL.

Powiązane problemy