2016-07-22 21 views
1

Ich habe eine Netzwerkmanager-Klasse erstellt, die von AFFTTPSessionManager erbt und ich habe Methoden für GET, POST usw. in der Klasse definiert. Hier ist die POST-Implementierung -So rufen Sie eine iOS-Methode aus dem Fehlerblock der gleichen Methode auf?

- (NSURLSessionTask*)performPOSTRequestToURL:(NSString*)postURL andParameters:(NSDictionary*)parameters withCompletionBlock:(WebServiceCompletionResponse)completionBlock { 

    [self POST:postURL parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { 
     /* Token is still valid, got success response/data */ 
     if (completionBlock) { 
      completionBlock(responseObject); 
     } 
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { 
     if ([error code] == SESSION_EXPIRED_CODE) { /* Token has expired because error code is SESSION_EXPIRED_CODE */ 

      /* Make call to refresh token */ 
      [[TokenLibrary sharedInstance] refreshToken:^(NSError *error, NSString *token) { 
       if (error) { 
        completionBlock(error); 
       } 
       else{ 
        /* Got refreshed token, I want to call performPOSTRequestToURL with the same url now. How do I do it? Is the call below okay? */ 
        [self performPOSTRequestToURL:postURL andParameters:parameters withCompletionBlock:completionBlock]; 
       } 
      }]; 
     } 
    }]; 
} 

Ich habe meine Frage in den letzten Kommentar oben gesetzt.

Grundsätzlich mache ich meine Netzwerkaufrufe zum Posten oder Abrufen von Daten und wenn es einen SERVER_EXPIRED_CODE als Fehlerantwort gibt, die ich von Webservice erhalte, muss ich zuerst das Token aktualisieren und dann den gleichen API-Aufruf erneut machen.

Kann ich den Methodenaufruf direkt anstelle des letzten Kommentars aufrufen? Oder gibt es andere oder bessere Möglichkeiten, es zu tun?

+2

Ja, Sie sind auf dem richtigen Weg, das ist eine saubere Möglichkeit, die API aufzurufen, sobald Sie das Token erfolgreich aktualisiert haben. – AtWork

+0

@AtWork Danke für die schnelle Antwort. Ich habe den Code-Block bearbeitet, um den Aufruf tatsächlich durchzuführen - [self performPOSTRequestToURL: postURL andParameters: Parameter withCompletionBlock: completionBlock]; Das sieht gut aus? – letsbondiway

+0

Sieht gut aus, sollte funktionieren. Hast du es versucht? – AtWork

Antwort

0

In diesem Block können Sie immer noch auf aktuelle Aufrufparameter zugreifen, da sie von block erfasst wird. Verwenden Sie einfach [self performPOSTRequestToURL: postURL ...], um die aktuelle Methode mit denselben Parametern aufzurufen.

+0

Danke, ich habe den Codeblock bei tatsächlichem Aufruf erneut bearbeitet. Ich glaube, so sollte es sein? – letsbondiway

+0

vielleicht ist es besser, Token-Refresh-Token-Logik innerhalb der POST-Methode zu implementieren.Ebenso machen es generischer für die Verwendung auch mit PUT, PATCH ... HTTP-Methoden sollten Sie Serverfehler mit generischen Methode automatisch sniffen, nachdem diese Methoden Antworten aufrufen. –

+0

Der Aufruf [self POST ...] ist der der Methode des AFFTTPSessionManager. Ja, aber ich verstehe deinen Standpunkt. Ich werde versuchen, es auf irgendeine andere Weise generisch oder sauberer zu machen. – letsbondiway