2016-08-23 3 views
0

Ich versuche Action/CocoaAction-Bibliothek zu verwenden. Die primäre Verwendung für jetzt ist die Anzeige eines UIAlertControllers und wenn eine UIAlertAction-Schaltfläche angeklickt wird, muss sie eine Funktion aufrufen, die in meinem viewModel definiert ist (changeAddress, die ein Observable zurückgibt).CocoaAction/Action mit UIAlertController

Mein Verständnis dafür wäre:

let ac = CocoaAction(workFactory: {[unowned self] _ in 
    self.viewModel!.requestChangeAddress() 
     .subscribeNext({ [unowned self] data in 
      if let response = data?.result 
      { 
       self.showResultOperation(response) 
      } 
     }) 
     .addDisposableTo(self.disposeBag) 
     return .empty() 
    }) 

let OKAction = UIAlertAction.Action("OK", style: .Default) 
OKAction.rx_action = ac 

Aber leider funktioniert es nicht. Die Schließung von workFactory wird korrekt aufgerufen, die Subskription wird jedoch nicht wirksam. Ich weiß, dass etwas nicht in Ordnung ist, wenn ich zurückkomme, aber ich weiß nicht, wie ich es lösen soll.

Wie kann ich das korrigieren? Was mache ich falsch?

Danke.

Antwort

0

große Frage! Vielen Dank für das Posten des Codes.

Ihr Code erhält die Observable von requestChangeAddress, aber dann wird es abonniert und es zu einem Entsorgungsbeutel hinzufügen. Die Action Klasse kümmert sich eigentlich um das für Sie, Sie müssen nur das Einwegprodukt zurückgeben.

Das Problem ist, dass Sie etwas mit den Werten tun möchten, die für die Aktion gesendet werden, und das Zurückgeben der Observablen lässt Sie das nicht tun. Sie müssen also einen Aufruf an doOnNext in der Beobachterkette einschließen. Hier ist, was es könnte wie folgt aussehen:

let ac = CocoaAction(workFactory: {[unowned self] _ in 
    return self.viewModel! 
     .requestChangeAddress() 
     .doOnNext({ [unowned self] data in 
      if let response = data?.result 
      { 
       self.showResultOperation(response) 
      } 
     }) 
     .map { _ in Void() } 
}) 

Mit doOn Funktionen in RxSwift eine gute Möglichkeit, Nebenwirkungen in den Observablen zu injizieren, wenn nötig, wie es hier ist.

EDIT: Ich habe die Karte am Ende hinzugefügt, um einen Compilerfehler zu beheben, da der Rückgabetyp von der Factory-Methode Observable<Void> ist.

+0

Danke, versuchte dabei ich so aber in der ersten Zeile gibt die complier diese Fehlermeldung: „Kann nicht Wert vom Typ konvertieren‚(_) -> beobachtbare

‘zu erwarten Argumente vom Typ‚_ -> beobachtbare <_>‘“ – jerrygdm

+0

Ah , Recht! Ich werde meine Antwort aktualisieren. –

+0

Danke ... fast alles gut. Ich habe ein Problem damit ... nach dem Tippen auf OK oder Abbrechen in der WarnmeldungContoller sieht die Schaltfläche wie deaktiviert aus, keine Berührung mehr feuern. Wie kann ich das Problem lösen? – jerrygdm

Verwandte Themen