操作
这个库与 RxSwift 一起使用,提供对可观测对象(动作)的抽象。
动作是一种表达“嘿,我以后需要你订阅这个”的方式。实际上,它比这要复杂得多。
动作接受一个 workFactory:一个接受一些输入并产生可观测对象的表达式闭包。当调用 execute() 时,它将参数传递给这个闭包并订阅工作。
- 只能在“启用”时执行(如果未指定则为
true)。 - 一次只能执行一项。
- 汇总单独执行中的 next/error 事件。
哦,它还有一个与 UIButton 非常酷的快速功能。它将管理按钮的启用状态,确保在您的工作正在进行时禁用按钮,所有这些。
用法
您必须传递一个 workFactory,它接受输入并返回一个 Observable。这代表一些需要完成的工作。每次调用 execute() 时,您都将传入一些输入供工作工厂使用。然后 Action 将订阅可观测对象并在其 elements 属性上发出 Next 事件。如果可观测对象发生错误,错误将作为 Next 事件发送到 errors 属性上。挺好的。
动作一次只能执行一项。如果您尝试执行一个当前正在执行的动作,您将得到一个错误。执行状态 executing 将发送 true 和 false 的值作为 Next 事件。
action: Action<String, Bool> = Action(workFactory: { input in
return networkLibrary.checkEmailExists(input)
})
...
action.execute("[email protected]")请注意,第一个泛型参数是输入的类型,第二个是workFactory创建的可观测类型的类型。你可以把它看作动作的“输出”。
您还可以在Action初始化器中指定一个enabledIf参数。
let validEmailAddress = emailTextField.rx.text.map(isValidEmail)
action: Action<String, Bool> = Action(enabledIf: validEmailAddress, workFactory: { input in
return networkLibrary.checkEmailExists(input)
})现在只有当电子邮件地址有效时,execute()才会执行工作。真是太棒了!
注意,enabledIf和enabled属性并不相同。你传递enabledIf和动作的当前执行状态,以判断动作是否当前处于启用状态。
真正酷的是UIButton扩展。它接受一个CocoaAction,这正是Action。
button.rx.action = action现在,当按钮被按下时,动作会被执行。按钮的enabled状态与动作的enabled属性绑定。这意味着你可以将你的表单验证逻辑作为信号传递给动作,按钮的启用状态将为你处理。此外,由于它一次只处理一件事情,动作执行完成前用户不能再次按下按钮。酷。查看这个CocoaAction在动作中的代码示例。
如果你想要使用Action进行复杂的操作,比如文件下载和下载进度报告(例如更新UI中的进度条),你将使用Action而不是CocoaAction。默认情况下,CocoaAction不能发送进度值,你的自定义Action会这样做。有关详细信息,请参阅这篇文章。
如果你的场景涉及许多需要触发同一Action的不同输入的按钮,你可以在每个UIButton上使用bindTo,并向闭包返回正确的输入。
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(或UIBarButtonItem),只需在一个地方订阅一次executing、errors、elements和completions。
还有一个很酷的扩展,它可以用于UIAlertAction,在UIAlertController中使用。一个限制:由于该类的限制,你不能使用常规初始化器实例化它。相反,调用这个类方法
let action = UIAlertAction.Action("Hi", style: .default)安装
CocoaPods
只需将以下行添加到你的Podfile中
pod 'Action'然后运行pod install,这样就会
Carthage
将此内容添加到 Cartfile}
github "RxSwiftCommunity/Action" ~> 4.0.0
如果您正在使用 RxSwift 3.2.0 或更低版本,请使用 Action ~2.2.0 代替!
然后执行
$ carthage update
感谢
这个库明显受到了 ReactiveCocoa 的 Action 类的启发。那些开发者值得很多感谢!
许可证
MIT 显而易见。
