0

我正在尝试使用 Action / CocoaAction 库。现在的主要用途是显示 UIAlertController,当点击 UIAlertAction 按钮时,它必须调用我的 viewModel 中定义的函数(changeAddress 返回 Observable)。

我对此的理解是:

let ac = CocoaAction(workFactory: {[unowned self] _ in
    self.viewModel!.requestChangeAddress()
        .subscribeNext({ [unowned self] data in
            if let response = data?.result
            {
                self.showResultOperation(response)
            }
        })
        .addDisposableTo(self.disposeBag)
        return .empty()
    })

let OKAction = UIAlertAction.Action("OK", style: .Default)
OKAction.rx_action = ac

但不幸的是,它不起作用。workFactory 闭包被正确调用,但订阅没有生效。当我返回 .empty 时,我知道出了点问题,但我不明白如何解决。

我该如何纠正?我做错了什么?

4

1 回答 1

0

好问题!感谢您发布代码。

因此,您的代码从 中获取 observable requestChangeAddress,然后订阅它并将其添加到处理包中。课程实际上会Action为您处理,您只需退回一次性用品。

问题是你想对动作中发送的值做一些事情,而返回 observable 不会让你这样做。所以你需要doOnNext在观察者链中包含一个调用。下面是它的样子:

let ac = CocoaAction(workFactory: {[unowned self] _ in
    return self.viewModel!
        .requestChangeAddress()
        .doOnNext({ [unowned self] data in
            if let response = data?.result
            {
                self.showResultOperation(response)
            }
        })
        .map { _ in Void() }
})

在 RxSwift 中使用doOn函数是在必要时将副作用注入你的 observable 的好方法,就像这里一样。

编辑:我在最后添加了地图来修复编译器错误,因为工厂方法的返回类型是Observable<Void>.

于 2016-08-23T21:23:29.763 回答