2017-02-17 8 views
0

UIViewControllerと私のビューモデルに依存する問題があります。 基本的に私のビューモデル内でviewDidLoadイベントを聞きたいです。RxSwift:被験者のないビューモデルからviewDidLoadを観察する

let viewModel = ViewModel() 
let viewController = UIViewController(viewModel) 

と私はviewDidLoadためRxCocoa拡張子作成しました:私は、パラメータでのViewModelをビューモデルとUIViewControllerをインスタンス化Class Aを持っている瞬間

var viewDidLoad: Observable<Void> { 
    return self.sentMessage(#selector(Base.viewDidLoad)).map { _ in Void() } 
} 

を今、私は」私のビューモデル内の観測可能な部分にこれを結びつけています。私はSubjectsでそれを行うことができますが、私はちょうどObservableを使用して反応的なアプローチをしたいです。 私はをビューモデルのコンストラクタパラメータとして注入することができますが、このようにしてアーキテクチャを壊して、UIViewControllerがビューモデルを内部的にインスタンス化することを許可したくないのですが、依存。

提案がありますか?私はこのソリューションを使用しました@tomahhする おかげ

ソリューション

感謝:

私のビューコントローラ:

override func configure(viewModel: ViewModel) { 
    viewModel.bindViewDidLoad(rx.viewDidLoad) 
} 

マイビューモデル:

func bindViewDidLoad(_ viewControllerDidLoad: Observable<Void>) { 
    //Create observers which depend on viewControllerDidLoad 
} 

答えて

1

ViewControllerが既にビューモデルについて知っている、それが初期化時にViewModel

class ViewController: UIViewController { 
    init(_ viewModel: ViewModel) { 
    viewModel.viewDidLoad = self.rx.viewDidLoad 
    } 
} 

をプロパティを設定することができそして、ViewModelでの観測では、それはだ場合、私は思ったんだけどviewDidLoad

struct ViewModel { 
    var viewDidLoad: Observable<Void> = .never() 

    var something: Observable<String> { 
    return viewDidLoad.map { "Huhu, something is guuut" } 
    } 
} 
+0

を導き出す計算プロパティとして定義することができビューモデルのクライアントが外部から 'viewDidLoad'を設定できるようにすることは安全です。そして 'viewDidLoad'を設定する前に' something'を使うと、 'viewDidLoad'によって放出されたイベントは受信されませんでしたか?あなたの答えをありがとうbtw –

+0

実際に私は 'viewDidLoad'と' something'の両方を内部的に設定する 'setViewDidLoad(..)'のようなビューモデルメソッドを使ってこれらの問題を解決することができました –

+0

あなたは、 'viewDidLoad'を設定します。たぶん別の方法は何かのためのビルダーメソッドを使用することでしょうか? 'funcのようなもの(viewDidLoad:Observable を使用) - > Observable '? – tomahh

関連する問題