2012-06-12 48 views
7

Dzwonię do serwisu internetowego z mojej aplikacji na iOS, który może potrwać do czterech minut. Używam RestKit do wywoływania i ładowania obiektów. Odkryłem, że gdy żądania trwają długo, otrzymuję błąd Timeout po ~ 60 sekundach. Próbowałem ustawić timeoutInterval na absurdalne kwoty, ale nadal kończy się po ~ 60.Timeout RestKit Ignorowany

RKObjectManager* objectManager = [RKObjectManager objectManagerWithBaseURL:HOSTNAME]; 

objectManager.client.requestQueue.showsNetworkActivityIndicatorWhenBusy = YES; 
objectManager.client.disableCertificateValidation = YES; 

//timeout 
objectManager.client.timeoutInterval = 1000; 

Oto wezwanie do służby:

- (void)loadData 
{ 

NSString *uid = [self retrieveFromUserDefaults:@"login_preference"]; 
NSString *pwd = [self retrieveFromUserDefaults:@"password_preference"]; 

if([uid isEqualToString:@""] || [pwd isEqualToString:@""]){ 
    [self stopSpinner]; 
    [self enableUserInterface:YES]; 
    UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"Missing Settings" 
                message:@"Please enter your login information in the settings." 
                delegate:nil 
              cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
    [alert show]; 
    return; 

} 


RKObjectManager* objectManager = [RKObjectManager sharedManager]; 
NSDictionary *params = [NSDictionary dictionaryWithObjects: 
         [NSArray arrayWithObjects:uid, pwd, nil] 
                forKeys:[NSArray arrayWithObjects:@"uid", @"pwd", nil]]; 

// Load the object model via RestKit  
[objectManager loadObjectsAtResourcePath:[@"/synchData" appendQueryParams:params] delegate:self]; 

}

Robię wezwanie do usługa w wątku tła - jest coś w tym projekcie, które mogłyby być powodując problem? Nie potrafię sobie wyobrazić, jak iOS nie pozwala, aby wątki działały dłużej niż 60 sekund? Po prostu nie mogę zrozumieć, na czym polega problem.

Czy czas oczekiwania to czas potrzebny na uzyskanie odpowiedzi z serwera lub uzyskanie CAŁKOWITEJ odpowiedzi z serwera? Zwracam potencjalnie bardzo dużą odpowiedź json - czy muszę zwrócić całość w limicie limitu czasu, czy też po prostu potrzebuję uzyskać odpowiedź od serwera w ramach limitu?

+0

Pokaż, jak wysyłasz swoje wnioski. Limit czasu to czas, w którym aplikacja czeka, aż otrzyma jakąkolwiek odpowiedź, nie trzeba w tym czasie zwrotu całości. – lawicko

+0

Dzięki - dodałem trochę, czy to miałeś na myśli? Sprawdziłem dwukrotnie i bez względu na to, jaki jest mój przedział czasu oczekiwania, umiera po 60 sekundach. – Michaela

+1

Tak, to właśnie miałem na myśli. Nie widzę niczego złego w twoim kodzie, jak możesz złapać limit czasu? Dokumenty RestKit mówią, że domyślny limit czasu jest ustawiony na 120 sekund, a funkcja limitu czasu 'zwróci RKRequestConnectionTimeoutError przez didFailLoadWithError:', więc jeśli złapiesz go w 'requestDidTimeout:' jest szansa, że ​​wywoła to inny mechanizm. Możesz umieścić debugger w metodzie, która przechwytuje limit czasu i zbadać stos wywołań, aby ustalić, co dokładnie powoduje przekroczenie limitu czasu, być może pomoże ci to określić, skąd pochodzi wartość 60s. – lawicko

Odpowiedz

0

Mam podobny problem, metoda delegata requestDidTimeout:(RKRequest*)request nigdy nie jest wywoływana. Nieważne, czy ustawię limit czasu na RKRequest lub RKClient.

Zastrzeżenie: Podczas ustawiania limitu czasu na żądanie widzę żądanie NIE respektując ustawionego limitu czasu , CHYBA ŻE dzwonię pod numer [requestObject createTimeOutTimer].

Jednak zauważyłem w twojej implementacji, że używasz 1000 dla NSTimeInterval: Czy masz na myśli 1000 sekund na timeout? Zmień na 1, jeśli masz na myśli sekundę = 1000 msek.

Domyślny limit czasu dla RestKit wynosi 120 sekund, więc najprawdopodobniej jest to limit czasu NSURLConnection.

2

Jeśli rozumiem problem, rozwiązaniem byłoby:

- (void)request:(RKRequest *)request didFailLoadWithError:(NSError *)error 

Więc kiedy masz problem z timeout, że zostanie złapany na tej metodzie.