RxSwift保持字符串状态没有主题或变量

时间:2017-10-23 14:11:49

标签: swift mvvm reactive-programming rx-swift

我想将我已经拥有的ViewModel转换成完整的Rx。 应用程序评估算术表达式。

ViewModel有两个字符串,一个带有'逻辑'符号,将发送到表达式赋值器以获取结果,以及一个'presentation'字符串,其中包含将在UI中显示的其他符号。

ViewController调用VM函数'keyPressed(keyID:Int)',它将用于修改'logical'字符串和'presentation'字符串,'keyPressed'使用右符号表示正确的字符串并通过附加新符号来修改它。

如何在没有任何状态(任何字符串)或至少没有表示字符串的情况下将VM转换为被动?

2 个答案:

答案 0 :(得分:0)

由于您不想保持状态,我假设您希望将逻辑符号字符串转换为流,然后由表达式评估代码映射或观察。在这种情况下,您可以将keyPressed(keyID: Int)值推送到PublishSubject,然后通过将scan运算符应用于subject.asObservable来创建逻辑表达式流。

以下是可能有用的帖子: http://rx-marin.com/post/rxswift-state-with-scan/

答案 1 :(得分:0)

//in viewModel
let logical = Variable<String>("")
let presentation = Variable<String>("")

func keyPressed(keyID: Int) {

    //do
    logical.value = "what?"
    presentation.value = "what?"
}

//in controller
func youWantToDo() {

    logical.asObservable().subscribe(onNext: <#T##((String) -> Void)?##((String) -> Void)?##(String) -> Void#>, onError: <#T##((Error) -> Void)?##((Error) -> Void)?##(Error) -> Void#>, onCompleted: <#T##(() -> Void)?##(() -> Void)?##() -> Void#>, onDisposed: <#T##(() -> Void)?##(() -> Void)?##() -> Void#>)

    presentation.asObservable().bind(to: <#T##ObserverType#>)
}