2012-06-12 14 views
7

Sto chiamando un webservice dalla mia app iOS, che può richiedere fino a quattro minuti per tornare. Sto usando RestKit per la chiamata e il caricamento degli oggetti. Quello che sto scoprendo è che quando le richieste richiedono molto tempo, ricevo un errore di timeout dopo ~ 60 secondi. Ho provato a impostare timeoutInterval su quantità assurde, ma è ancora scaduto dopo ~ 60.RestKit Timeout Ignorato

RKObjectManager* objectManager = [RKObjectManager objectManagerWithBaseURL:HOSTNAME]; 

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

//timeout 
objectManager.client.timeoutInterval = 1000; 

Ecco la chiamata al servizio:

- (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]; 

}

che sto facendo la chiamata al webservice in un thread in background - c'è qualcosa in quel disegno che potrebbe essere causando il problema? Non riesco a immaginare cosa, come iOS, non permette che i thread in background vengano eseguiti per più di 60 secondi? Non riesco a capire qual è il problema.

È il timeout necessario per ottenere una risposta dal server o per ottenere la risposta INTERA dal server? Sto restituendo una risposta JSON potenzialmente molto grande - devo restituire l'intera cosa entro il limite di timeout, o devo solo ottenere una risposta dal server entro il limite?

+0

Mostraci come spedisci le tue richieste. Il timeout è il tempo in cui l'applicazione attende fino a quando non ottiene alcuna risposta, non è necessario restituire l'intera operazione entro questo tempo. – lawicko

+0

Grazie - ho aggiunto un po ', è questo che intendevi? Ho controllato due volte e non importa quale sia il mio intervallo di timeout, sta morendo dopo 60 secondi. – Michaela

+1

Sì, questo è ciò che intendevo. Non vedo nulla di sbagliato nel tuo codice, come fai a prendere il timeout? I documenti RestKit dicono che il timeout predefinito è impostato su 120 secondi e che la funzione di timeout 'restituirà un RKRequestConnectionTimeoutError tramite didFailLoadWithError:', quindi se lo si cattura in 'requestDidTimeout:' c'è la possibilità che qualche altro meccanismo lo invochi. Potresti voler mettere un debugger in un metodo che cattura il timeout ed esaminare lo stack di chiamate per scoprire cosa causa esattamente il timeout, forse questo ti aiuterà a identificare da dove viene il valore degli anni '60. – lawicko

risposta

0

Sto riscontrando un problema simile, il metodo delegato requestDidTimeout:(RKRequest*)request non è mai stato chiamato. Non importa se imposto il timeout su RKRequest o RKClient.

Caveat: Quando si imposta il timeout su richiesta, vedo la richiesta non rispettando il timeout impostato MENO anche io chiamo [requestObject createTimeOutTimer].

Tuttavia, quello che noto nella tua implementazione è che usi 1000 per un NSTimeInterval: intendi 1000 secondi per il timeout? Passa a 1 se intendi un secondo = 1000 msec.

Il timeout predefinito su RestKit è 120 secondi, quindi molto probabilmente si tratta di un timeout NSURLConnection.

2

Se ho ben capito il problema, la soluzione potrebbe essere:

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

Quindi, quando avete problema con intervallo di timeout, verrà preso in questo metodo.