使用UIAlertController进行CocoaAction / Action

时间:2016-08-23 21:09:23

标签: swift uialertcontroller rx-swift rx-cocoa

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

我对此的理解是:

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闭包,但订阅不会生效。当我回来时,我知道出了什么问题。但是我无法理解如何解决。

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

1 个答案:

答案 0 :(得分:0)

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

所以你的代码从requestChangeAddress获得了observable,但随后它订阅了它并将它添加到了一个dispose包中。 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<Void>