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?
Ja, Sie sind auf dem richtigen Weg, das ist eine saubere Möglichkeit, die API aufzurufen, sobald Sie das Token erfolgreich aktualisiert haben. – AtWork
@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
Sieht gut aus, sollte funktionieren. Hast du es versucht? – AtWork