2012-06-12 24 views
7

Ich rufe einen Webservice von meiner iOS App an, der bis zu vier Minuten dauern kann. Ich verwende RestKit zum Aufruf und Laden der Objekte. Was ich finde, ist, dass, wenn die Anfragen eine lange Zeit benötigen, ich einen Timeout-Fehler nach ~ 60 Sekunden bekomme. Ich habe versucht, das timeoutInterval auf absurde Beträge zu setzen, aber es kommt immer noch nach ~ 60 aus.RestKit Timeout Wird ignoriert

RKObjectManager* objectManager = [RKObjectManager objectManagerWithBaseURL:HOSTNAME]; 

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

//timeout 
objectManager.client.timeoutInterval = 1000; 

Hier ist der Aufruf an den Dienst:

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

}

ich den Anruf an den Webservice in einem Hintergrund-Thread zu tun - es ist etwas in diesem Design, das sein könnte verursacht das Problem? Ich kann mir nicht vorstellen, wie iOS Hintergrund-Threads nicht länger als 60 Sekunden laufen lässt? Ich kann einfach nicht herausfinden, was das Problem ist.

Ist das Zeitlimit die Zeit, die benötigt wird, um eine Antwort vom Server zu erhalten, oder um die GANZE Antwort vom Server zu erhalten? Ich gebe eine möglicherweise sehr große JSON-Antwort zurück - muss ich das Ganze innerhalb des Timeout-Limits zurückgeben, oder muss ich nur eine Antwort vom Server innerhalb des Limits bekommen?

+0

Zeigen Sie uns, wie Sie Ihre Anfragen versenden. Die Zeitüberschreitung ist die Zeit, die Ihre Anwendung wartet, bis sie eine Antwort erhält. Sie müssen das Ganze nicht innerhalb dieser Zeit zurückgeben. – lawicko

+0

Danke - Ich habe ein bisschen hinzugefügt, ist das was du meintest? Ich habe es zweimal überprüft und egal, wie hoch mein Timeout-Intervall ist, es ist nach 60 Sekunden zu Ende. – Michaela

+1

Ja, das habe ich gemeint. Ich sehe nichts falsch mit Ihrem Code, wie fangen Sie die Zeitüberschreitung ein? Die RestKit-Dokumentation sagt, dass das Standard-Timeout auf 120 Sekunden gesetzt ist und diese Timeout-Funktion einen RKRequestConnectionTimeoutError über didFailLoadWithError zurückgibt: ', wenn Sie es in' requestDidTimeout: 'fangen, besteht die Möglichkeit, dass ein anderer Mechanismus es aufruft. Vielleicht möchten Sie einen Debugger in eine Methode einfügen, die das Timeout abfängt und den Call-Stack untersucht, um herauszufinden, was genau das Timeout verursacht. Vielleicht hilft Ihnen das, den Ursprung des 60s-Wertes zu ermitteln. – lawicko

Antwort

0

Ich habe ein ähnliches Problem, die Delegierten Methode requestDidTimeout:(RKRequest*)request nie aufgerufen werden. Egal, ob ich das Timeout für RKRequest oder RKClient festlege.

Caveat: Wenn auf Antrag die Timeout-Einstellung, ich sehe die Anforderung nicht die eingestellte Timeout respektieren , wenn ich auch [requestObject createTimeOutTimer] nennen.

Allerdings, was ich in Ihrer Implementierung feststellen, ist, dass Sie 1000 für einen NSTimeInterval verwenden: Meinst du 1000 Sekunden für das Timeout? Ändere auf 1 wenn du eine Sekunde meinst = 1000 ms.

Das Standard-Zeitlimit für RestKit beträgt 120 Sekunden. Dies ist höchstwahrscheinlich ein NSURLConnection-Timeout.

2

Wenn ich Ihr Problem zu verstehen, wäre die Lösung:

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

Also, wenn Sie Probleme mit Timeout-Zeit haben, wird es bei dieser Methode gefangen werden.