2017-04-25 1 views
0

den Code Betrachten unterReactiveSwift: Wiederholen Sie bis zu n-mal, und führen Sie dann einen Code

func test() -> SignalProducer<String, Error> { 
    return SignalProducer<String, Error> { observer, _ in 
     ... 
    } 
} 

test() 
    .on(value: { s in 
     print(s) 
    }) 
    .retry(upTo: 2) 
    .start() 
} 

Gibt es eine eingebaute Möglichkeit, n-mal zu wiederholen, dann (wenn sie alle Versuche gescheitert) ausführen einigen Rückruf ?

Es ist natürlich möglich, einen lokalen Zähler einzuführen und die Fehler in .on(failed: _) zu zählen und dann etwas zu tun, wenn der Zähler gleich n + 1 ist, aber gibt es einen anderen Weg, es zu tun?

Antwort

2

retry(upTo:) übergibt den Fehler, sobald es das Wiederholungslimit erreicht hat. Sie können also eine der Methoden start verwenden, mit der Sie Werte und einen Fehler behandeln können. Zum Beispiel mit startWithResult Sie dies tun könnte (man beachte, habe ich diesen Code nicht getestet, aber es sollte Ihnen die Idee geben):

test() 
    .retry(upTo: 2) 
    .startWithResult { result in 
     switch result { 
     case let .success(value): 
      print(value) 
     case let .failed(error): 
      // handle error here 
     } 
    } 
+0

Was hier wichtig ist, ist die Reihenfolge, das Hinzufügen der '.retry' vor dem' .on' handlers übergibt nur den letzten Fehler (in diesem Fall den gewünschten Effekt). Das habe ich irgendwie vermisst. – Buddy

+1

Ja, jeder Operator erstellt tatsächlich ein neues Signal/Produzent, der den vorherigen mit etwas Logik oder Transfomation umschließt. Also wird "Wiederholen" in Ihrem ursprünglichen Code den Hersteller erneut versuchen, wie durch den gesamten Code definiert, der vor ihm liegt, einschließlich der On-Side-Effekte. – jjoelson

Verwandte Themen