2016-01-16 5 views
5

In meiner App können 2-4 API-Aufrufe an meinen Server gleichzeitig (asynchron) innerhalb der API-Klasse NSURLSession stattfinden. Um API-Anfragen an meinen Server zu stellen, muss ich das Authentifizierungs-Token in der HTTPHeaderField von jedem NSURLRequest angeben. Das Token ist für einen Tag gültig und wenn es nach einem Tag ungültig wird, muss ich das Token aktualisieren.iOS - Neuversuch fehlgeschlagen NSURLRequests in NSURLSession

Ich tue dies in dem folgenden Code in meiner API-Klasse:

/*! 
* @brief sends a request as an NSHTTPURLResponse. This method is private. 
* @param request The request to send. 
* @param success A block to be called if the request is successful. 
* @param error A block to be called if the request fails. 
*/ 
-(void)sendTask:(NSURLRequest*)request successCallback:(void (^)(NSDictionary*))success errorCallback:(void (^)(NSString*))errorCallback 
{ 
    NSURLSessionDataTask *task = [self.session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) 
    { 
     [self parseResponse:response data:data fromRequest:request successCallback:success errorCallback:^(NSString *error) 
     { 
      //if auth token expired and getting "not authenticated" error (status 401) 
      NSHTTPURLResponse *httpResp = (NSHTTPURLResponse*) response; 
      if (httpResp.statusCode == 401) { 
       [self refreshAuthenticationTokenWithSuccessCallback:^(NSDictionary *response) { 
        self.authToken = response[@"token"]; 
        //attempt to re-try the request that failed due to token expiration 
        [self sendTask:request successCallback:success errorCallback:errorCallback]; 
       } errorCallback:^(NSString *error) { 
        //two weeks have passed and the token is no longer refreshable 
        NSLog(@"TOKEN NOT REFRESHABLE! HAVE TO LOG IN MANUALLY"); 
       }]; 
      } 
     }]; 
    }]; 
    [task resume]; 
} 

Diese sendTask Methode mit jeder API-Anfrage ausgeführt wird ich in der App zu machen, so dass ich gerade realisiere dies eine schlechte Art und Weise ist, es zu tun . Wenn 3 API-Anforderungen fehlschlagen, weil das Token ungültig ist (ein Tag ist vergangen), werden alle 3 dieser API-Anfragen versuchen, den API-Aufruf zu veranlassen, das Authentifizierungstoken zu aktualisieren.

Gibt es eine Möglichkeit für mich, falls eine der API-Anforderungen fehlschlägt, das Authentifizierungstoken nur einmal zu aktualisieren und dann die fehlgeschlagenen API-Aufrufe erneut zu versuchen?

EDIT

ich den Titel der Frage bearbeitet, um anzuzeigen, dass ich mit NSURLSession

PROGRESS

Bisher bin arbeiten mehreren gescheiterten API zu verhindern Anfragen von versuchen, das Authentifizierungstoken zur gleichen Zeit zu aktualisieren, habe ich eine NSArray für alle fehlgeschlagenen Anfragen ein nd eine NSNumber, die als Sperre dient, um sicherzustellen, dass das Authentifizierungstoken nur einmal versucht wird, aktualisiert zu werden. Ich tue dies im folgenden Code:

Gehe ich richtig? Ein Teil, über den ich paranoid bin, ist, dass ich den Callback success oder error an bestimmten Punkten nicht wirklich anrufe. Kann dies zu Problemen führen?

Antwort

-1

Anstatt [self sendTask:] zu verwenden, versuchen Sie es mit [weakSelf sendTask]. Überprüfen Sie unter Code:

-(void)sendTask:(NSURLRequest*)request successCallback:(void (^)(NSDictionary*))success errorCallback:(void (^)(NSString*))errorCallback 
{ 

    __weak __typeof(self)weakSelf = self; 
    NSURLSessionDataTask *task = [self.session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) 
    { 
     [self parseResponse:response data:data fromRequest:request successCallback:success errorCallback:^(NSString *error) 
     { 
      //if auth token expired and getting "not authenticated" error (status 401) 
      NSHTTPURLResponse *httpResp = (NSHTTPURLResponse*) response; 
      if (httpResp.statusCode == 401) { 
       [self refreshAuthenticationTokenWithSuccessCallback:^(NSDictionary *response) { 
        self.authToken = response[@"token"]; 
        //attempt to re-try the request that failed due to token expiration 
        [weakSelf sendTask:request successCallback:success errorCallback:errorCallback]; 
       } errorCallback:^(NSString *error) { 
        //two weeks have passed and the token is no longer refreshable 
        NSLog(@"TOKEN NOT REFRESHABLE! HAVE TO LOG IN MANUALLY"); 
       }]; 
      } 
     }]; 
    }]; 
    [task resume]; 
} 
+0

Woops, danke für den Fang. Ich habe vergessen, das schwache Selbst dort hinein zu legen. Aber wie verhindert dies, dass mehrere fehlgeschlagene Anfragen versuchen, das Token gleichzeitig zu aktualisieren? – Rafi

+0

Es wird nicht, aber es behebt nur Wiederholungsfehler. –

Verwandte Themen