gpt4 book ai didi

ios - 查看模型依赖注入(inject)

转载 作者:行者123 更新时间:2023-11-29 11:42:42 26 4
gpt4 key购买 nike

ItemDetailViewModel 使用以下签名进行初始化:

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

它在 ItemDetailViewController 中初始化,它从源 Controller 的 segue 中获取一个 Item。我意识到 ItemDetailViewController 在技术上是 View,因此它不应该将 Item 作为存储属性。我如何将 Item 传输到 ItemDetailViewModel?这也意味着 ItemListViewController 不应有 selectedItem 存储属性以在 prepareFor(segue:) 中使用。

可能的解决方案

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

如何处理按钮点击,每次点击都会更改其图像?通过功能?

初始化 View 模型注入(inject)依赖项的正确方法是什么?

最佳答案

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

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

你的 View Controller 会接受这个函数的结果:

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

然后在您之前的 View Controller 中为 segue 做准备:

if let controller = segue.destinationViewController as? ItemDetailViewController {
controller.viewModelFactory = ItemDetailViewModel.factory(item: anItem, api: api)
}

关于ios - 查看模型依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45581712/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com