简介
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: