操作 5.0.0

Action 5.0.0

测试已测试
语言语言 SwiftSwift
许可证 MIT
发布最后发布2021 年 8 月
SPM支持 SPM

Ash FurrowFlorent PilletRxSwift Communityobi bob godwin 维护。



 
依赖
RxSwift~> 6.0
RxCocoa~> 6.0
 

Action 5.0.0

CircleCI

操作

这个库与 RxSwift 一起使用,提供对可观测对象(动作)的抽象。

动作是一种表达“嘿,我以后需要你订阅这个”的方式。实际上,它比这要复杂得多。

动作接受一个 workFactory:一个接受一些输入并产生可观测对象的表达式闭包。当调用 execute() 时,它将参数传递给这个闭包并订阅工作。

  • 只能在“启用”时执行(如果未指定则为 true)。
  • 一次只能执行一项。
  • 汇总单独执行中的 next/error 事件。

哦,它还有一个与 UIButton 非常酷的快速功能。它将管理按钮的启用状态,确保在您的工作正在进行时禁用按钮,所有这些。👍

用法

您必须传递一个 workFactory,它接受输入并返回一个 Observable。这代表一些需要完成的工作。每次调用 execute() 时,您都将传入一些输入供工作工厂使用。然后 Action 将订阅可观测对象并在其 elements 属性上发出 Next 事件。如果可观测对象发生错误,错误将作为 Next 事件发送到 errors 属性上。挺好的。

动作一次只能执行一项。如果您尝试执行一个当前正在执行的动作,您将得到一个错误。执行状态 executing 将发送 truefalse 的值作为 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()才会执行工作。真是太棒了!

注意,enabledIfenabled属性并不相同。你传递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"}

button1button2共享同一Action,但它们为其提供不同的输入(对应于触摸时的打印的HelloGoodbye)。

更复杂的用例可能是一个与UIViewController相关的单个动作,该控制器管理你的导航、错误处理和加载状态。这种方法可以让你有任意多的UIButton(或UIBarButtonItem),只需在一个地方订阅一次executingerrorselementscompletions

还有一个很酷的扩展,它可以用于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

感谢

这个库明显受到了 ReactiveCocoaAction的启发。那些开发者值得很多感谢!

许可证

MIT 显而易见。

Permissive licenses are the only licenses permitted in the Q continuum.