2017-10-30 3 views
0

Ich erstelle ein benutzerdefiniertes Observable, das einen UIAlertController darstellt, der beim Drücken einen API-Aufruf auslösen möchte. Ich kann jedoch nicht den Warnhinweis zum Popup bringen, wenn ich ihn nicht manuell abonniere. Gibt es eine Möglichkeit, dies vom ViewModel ausgelöst zu bekommen?RxSwift-Trigger beobachtbar auf Knopfdruck

MyController.swift

class MyController: UIViewController { 
    @IBOutlet weak var nextBarButton: UIBarButtonItem! 

    var viewModel: ViewModel! 

    override func viewDidLoad() { 
     super.viewDidLoad() 


     viewModel = ViewModel(nextBarButton.rx.tap.asDriver(), alertController()asDriver(onErrorJustReturn: "")) 
    } 

    func alertController() -> Observable<String> { 
     return Observable.create { [weak alert = self] observer in 
      guard let alert = alert else { 
       observer.on(.completed) 
       return Disposables.create() 
      } 

      let alertVc = UIAlertController(title: "My Title", message: "My Message", preferredStyle: .alert) 
      let submit = UIAlertAction(title: "Continue", style: .default) { _ in 
       observer.onNext("Test") 
       observer.on(.completed) 
      } 
      let cancel = UIAlertAction(title: "Cancel", style: .cancel) { _ in 
       observer.on(.completed) 
      } 
      alertVc.addAction(cancel) 
      alertVc.addAction(submit) 
      alert.present(alertVc, animated: true, completion: nil) 

      return Disposables.create { 
       alertVc.dismiss(animated: true, completion: nil) 
      } 
     } 
    } 
} 

ViewModel.swift

public final class ViewModel { 
    init(_ manager: SessionManager, _ trigger: Driver<Void>, _ alert: Driver<String>) { 
     let _ = trigger.withLatestFrom(alert) 
      .flatMap { text in 
       return manager.rx 
        .request(urlRequest: Api.test) 
        .retry(3) 
        .asDriverOnErrorJustComplete() 
      } 
    } 
} 

Antwort

0

Sie haben vergessen zu subscribe() in Ihrem ViewModel und Sie sollten flatMapLatest, wenn Ereignisse von UIButton verketten. Es sollte so aussehen:

public final class ViewModel { 
    init(_ manager: SessionManager, _ trigger: Driver<Void>, _ alert: Driver<String>) { 
     let _ = trigger.flatMapLatest{ alert } 
      .flatMap { text in 
       return manager.rx 
        .request(urlRequest: Api.test) 
        .retry(3) 
        .asDriverOnErrorJustComplete() 
      } 
      .subscribe() 
    } 
}