【发布时间】:2017-07-20 11:51:00
【问题描述】:
我有一个 MVVM 测试项目来试验 RxSwift。我有一个 UItextfield 一个按钮。用户输入食物名称,单击按钮,触发从 API 获取以获取该食物的所有食谱。
查看模型
struct FoodViewModel
var foodIdentifier: Variable<String> = Variable<String>("")
init() {
foodIdentifier.asObservable().subscribe(onNext: { (identifier) in
self.getRecipes() // Get from API
})
}
}
视图控制器
class FoodViewController: UIViewController {
@IBOutlet weak var foodTextField: UITextField!
@IBAction func setCurrentRace(_ sender: Any) {
viewModel.foodIdentifier.value = foodTextField.text!
}
}
编译后报错
Closure cannot implicitly capture a mutating self parameter
我做错了什么?我认为这是因为 FoodViewModel 的结构。如果是,我该如何使用 struct 来实现?
【问题讨论】:
-
你在哪里实例化你的虚拟机?
-
我认为您不应该将订阅直接放在 viewModel 的 init 中。您应该在带有订阅的 VM 中拥有一个方法 listenToFoodIdentifier,在您实例化 VM 后,在您的 VC 中调用 viewModel.listenToFoodIdentifier()
-
原因是结构是值类型,闭包的实例将获得自己的、独立的捕获值的副本,并且只有它可以更改。该值是在执行闭包时捕获的。
-
这个答案会对你有所帮助:stackoverflow.com/questions/41940994/…
-
你为什么这么想避课?要使用 Rx 闭包,您需要获取您订阅的对象的引用(通常您避免使用 [unowned self] 的强引用循环)而不是该对象的值,因此类不是结构
标签: swift mvvm rx-swift rx-cocoa