查看模型依赖注入

时间:2017-08-09 04:29:56

标签: ios mvvm dependency-injection viewmodel rx-swift

使用以下签名初始化

ItemDetailViewModel

init(item: Item, didPressButton: Observable<Void>, api: FirebaseAPI)

它在ItemDetailViewController中初始化,从源控制器的segue获取Item。我意识到ItemDetailViewController在技术上是View,所以它不应该有Item作为存储属性。我还如何将Item转移到ItemDetailViewModel?这也意味着ItemListViewController不应该在selectedItem中使用prepareFor(segue:)存储的属性。

潜在解决方案

因此,当CollectionView Cell(源控制器)中的ItemListViewController被点击时,它应该通过绑定到存储ItemListViewModel,然后Item来触发perform segue。同时,在prepareForSegue中,我使用ItemListViewModel使用ItemDetailViewModel初始化Item。好的..那可行。

如何处理按钮水龙头,它会在每个水龙头上改变图像?通过功能?

初始化view modelsinject dependencies的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

您有一个对象需要构建三个数据,但其中一个数据来自与其他两个不同的数据源。这是使用高阶函数的好时机。

Some&& h() {
  Some&& ro1 = f();
  // Code skipped here
  return std::forward<Some>(ro1);
}

void g1() {
  Some&& ro2 = h();
  // Is ro2 still refering to a valid object?
}

您的视图控制器将接受此功能的结果:

struct ItemDetailViewModel {
    static func factory(item: Item, api: FirebaseAPI) -> (_ action: Observable<Void>) -> ItemDetailViewModel {
        return { action in 
            return ItemDetailViewModel(item: item, didPressButton: action, api: api)
        }
    }
}

然后在您之前的视图中,控制器准备了segue:

class ItemDetailViewController: UIViewController {
    var viewModelFactory: (Observable<Void>) -> ItemDetailViewController = { _ in fatalError("factory called before provided.") }

    override func viewDidLoad() {
        super.viewDidLoad()
        let viewModel = viewModelFactory(myButton.rx.tap.asObservable())
        // bind output to view model
    }
}