RxSwift 4.Action

文章目录
  1. 1. 如何使用

原文:Action

该库与RxSwift一起使用,以在可观察对象之上提供抽象:Action。

Action 是说“嘿,稍后我需要你订阅此内容”的一种方式。实际上,它涉及的更多。

Action 初始化时需要 workFactory: 一个需要一些输入并产生可观察值的闭包。调用 execute() 时,它将参数传递给此闭包并订阅工作。

  • 只有在“enabled”时才可以执行(如果未指定,则为true)
  • 一次只执行一件事。
  • 汇总各个执行中的 next/error 事件

Action 和 UIButton 配合使用。它管理按钮的 enable 状态,确保在工作完成时禁用按钮

如何使用

  • 必须传递一个 workFactory ,该工厂接受输入并返回一个 Observable
  • 每当你调用 execute(input),你传入的 input 传入到 workFactory 执行
  • Action 订阅 Observable 对象,然后在 Actionelements 属性上发 Observable 的 Next事件
  • 如果 Observable 发出 event 事件,这个 error 会以 next 事件在 Actionerrors 属性中以 next 事件发出

Actions 每次只能执行一次,如果你尝试执行一个正在 executing 的 action,会得到一个 error。Actionexecuting 属性会发送 next 事件,关联值是 ture or false

1
2
3
4
5
action: Action<String, Bool> = Action(workFactory: { input in
return networkLibrary.checkEmailExists(input)
})
...
action.execute("ash@ashfurrow.com")

注意:

  • 第一个泛型参数是 input 的类型。
  • 第二个泛型是 workFactory 闭包创建的 Observable 发送 next 事件的数据类型(你可以把它看做 Action 的Output)

还可以为 Action 初始化程序指定 enabledIf 参数。

1
2
3
4
let validEmailAddress = emailTextField.rx.text.map(isValidEmail)
action: Action<String, Bool> = Action(enabledIf: validEmailAddress, workFactory: { input in
return networkLibrary.checkEmailExists(input)
})

此时 execute() 只有当 email address 合法才会执行.

注意, enabledIfenabled 属性不同。

UIButton 扩展:它接受CocoaAction,它的类型是 Action <Void,Void>

1
button.rx.action = action

当按下按钮时,action 执行操作。button 的 enable 属性和 action 的 enabled 属性绑定。这意味着你可以将表单验证逻辑作为信号输入到 action 中,并为你处理按钮的启用状态。同样,用户不能在动作完成执行之前再次按下按钮,因为它一次只能处理一件事。看看这个实际的CocoaAction代码示例。

如果你想使用 Action 进行复杂的操作,例如使用下载进度报告下载文件(例如,更新UI中的进度条),那么可以使用 Action<Void,Int> 代替CocoaAction。开箱即用的CocoaAction无法发出进度值,你自己的 Action<Void,Int> 将做到这一点。有关详细信息,请参阅本文

如果你的方案涉及许多需要触发同一操作以提供不同输入的按钮,则可以在每个UIButton上使用bindTo,并使用闭包返回正确的输入。

1
2
3
4
5
6
7
8
let button1 = UIButton()
let button2 = UIButton()
let action = Action<String, String> { input in
print(input)
return .just(input)
}
button1.rx.bindTo(action) { _ in return "Hello"}
button2.rx.bindTo(action) { _ in return "Goodbye"}

button1和button2共享相同的Action,但是它们使用不同的输入(相应的输出Hello和Goodbye)

更复杂的用例可以是与UIViewController相关的单个操作,该操作管理你的导航,错误处理和加载状态。通过这种方法,可以根据需要拥有任意数量的 UIButton(或UIBarButtonItems),在一个公共位置一次性订阅 executingerrorselements

UIAlertController 还使用了一个非常酷的 UIAlertAction 扩展。一招:由于该类的限制,你无法使用常规的初始化程序实例化它。相反,请调用此类方法:

1
let action = UIAlertAction.Action("Hi", style: .default)