简介
Action是observable的一个抽象库,它定义了一个动作,传入输入的事件,然后对事件进行处理,返回处理结果。它有如下特点:
- 只有
enabled
的时候才会执行,可以传入enabledIf
参数 - 同时只能执行一个,下次
input
必须等上次的action
执行完 - 可以分别处理错误和next
创建Action
Action
被定义为一个类Action<Input, Element>
,Input
是输入的元素,Element
是Action
处理完之后返回的元素。
一个简单的例子,没有输入也没有输出如下:
1 | let buttonAction: Action<Void, Void> = Action { |
或者传入用户名密码,返回登录结果:
1 | let loginAction: Action<(String,String), Bool> = Action{ |
连接Button
buttonAction
怎么使用,你可以把它和button
的点击绑定起来:
1 | button.rx.action = buttonAction |
每次点击按钮Action
都会执行,如果上一次的点击Action
没有完成的话,这个的点击将会无效。
设置为nil
去取消绑定
1 | button.rx.action = nil |
用户登录
我们可以把输入的账号密码绑定到上面的loginAction
:
1 | let usernameAndPassword = Observable.combineLatest(username.rx.text.orEmpty, password.rx.text.orEmpty) |
输入的账号密码绑定到loginAction.inputs
,然后订阅loginAction
的结果。
cell点击
可以给每个UITableViewCell
里面的button去绑定一个Action
:
1 | let items = Observable.just( |
execute
除了绑定输入以外,还可以主动去执行Action
:
1 | loginAction.execute(("admin","password")) |
通过execute
传入账号密码,然后执行Action
并订阅结果。
enabledIf
只有当条件满足的时候Action
才会执行:
1 | let usernameCount = username.rx.text |
UIAlertAction
UIAlert
的Action
绑定:
1 | validateUsername.elements |
总结
Action
可以用来定一个动作触发后的一个行为,也可以绑定多个动态到同一个Action
,和MVVM
结合的时候变得尤为合适。
代码见github: