Alamofire: Wie behandelt man 401 global?

8

Ich versuche eine Klasse zu erstellen, die meine Netzwerkaufrufe für mein Projekt verwaltet. Zu dieser Zeit meine ich Fehler global zu behandeln, alles war in Ordnung. Ich habe zwei Funktionen geschaffen; für Post-Anfragen postRequest(:_) und für Anfragen getRequests(:_) . Datamaker-Funktionen zur Rückgabe von Daten wie URL, Parameter, Header usw., Dataparser-Funktionen zum Parsen von Antwortdaten und schließlich eine Funktion zur Fehlerbeseitigung namens errorHandler() .

Wenn ich die Anfrage-Funktion aufruft, gebe ich einen Parameter, um zu helfen, welche Anfrage sie machen soll. In der Funktion ruft er Datamakers auf, um zuerst Daten zu erhalten, dann stellt er eine Anfrage mit Alamofire , und am Ende, wenn die Anfrage erfolgreich war, ruft er datparser und onSuccess(data:) closure auf oder wenn nicht, ruft er errorHandler(statusCode:) und% co_de auf % Schließung

Ich habe einen Schalterblock in onFailure(message:) eingefügt und statusCode für seinen Parameter angegeben. In errorHandler habe ich case 401 aufgerufen und in seiner Fertigstellung Token().refresh() 's abgeschlossen. Im Completion-Block errorHanlder / postRequest habe ich die errorHandler erneut mit den gleichen Parametern aufgerufen. Es hat nicht funktioniert. Ich weiß nicht warum, es ging immer in Endlosschleife und stellte nacheinander Anfragen.

Also habe ich beschlossen, cnoon die Klasse postRequest zu probieren (kann in diesem Link gefunden werden; Alamofire: Wie man Fehler global behandelt ). Ich habe es ein wenig geändert (einen neuen Parameter als Header hinzugefügt und den AuthorizationManager -Typ in NetworkSuccessHandler geändert). Hier ist das neue Formular:

%Vor%

Habe es in meinem NSData like:

aufgerufen %Vor%

Und Verwendung von postRequest in postRequests :

%Vor%

Dies ist der aktuelle Status. Wenn ich den Code starte und versuche mich anzumelden ViewController funktioniert nicht. Es druckt nur;

%Vor%

Und schließlich, ich weiß nicht, ob es relevant ist, aber es gibt gelbe Warnung an dieser Linie:

%Vor%

sagt AuthorizationManager

Um zusammenzufassen, muss ich herausfinden, wie ich mit 401 umgehen kann und ich weiß, wie man "Result of call to 'map' is unused" auf eine andere Weise benutzt.

BEARBEITEN :

Ich habe versucht, den Code direkt von AuthorizationManager auszuführen, aber es funktioniert überhaupt nicht. Es ist wie Code ist unsichtbar.

%Vor%     
Faruk 17.03.2016, 13:37
quelle

1 Antwort

2

Es kann vorkommen, dass Ihr AuthorizationManager nach dem ersten Versuch, die Anfrage zu senden, nicht mehr aktiv ist.

Normalerweise ist es eine gute Übung, das Singleton-Muster zu vermeiden, aber das ist kein schlechter Fall dafür:

%Vor%

Wenn Sie Ihre Anfrage aufrufen, verwenden Sie diese Singleton-Instanz, anstatt einen neuen Autorisierungs-Manager wie

zu instanziieren %Vor%

Ich vermute, dass dies das Problem sein könnte, da, wenn Sie Ihren Autorisierungs-Manager in beiden Fällen erstellen, nichts aktiv dieses Objekt behält. Der Manager kann erstellt werden, die Anforderung ausführen und dann vor der CachedTask oder sogar vor der Completion-Behandlung freigegeben werden. In diesem Fall würde Ihr guard let strongSelf = self else { return } einfach zurückkehren, ohne Ihre Completions oder CachedTasks auszuführen.

Hoffentlich hilft das. Wenn das das Problem ist, sollte diese Singleton-Lösung sehr einfach sein.

    
tbogosia 27.06.2017, 01:47
quelle

Tags und Links