操作
这个库与 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 显而易见。