2017-10-30 18 views
0

私は、押されたときにAPI呼び出しをトリガーするUIAlertControllerを表示するカスタムオブザーバブルを作成しています。しかし、手動で購読しない限り、Alertをポップすることはできません。これをviewModelからトリガーする方法はありますか?ボタンタップで観測可能なRxSwiftトリガー

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() 
      } 
    } 
} 

答えて

0

はあなたのViewModelsubscribe()に忘れてしまった、あなたはUIButtonからイベントをflatMapLatest連鎖する必要があるとき。次のようになります。

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() 
    } 
} 
関連する問題