zoukankan      html  css  js  c++  java
  • RxSwiftCommunity/Action使用介绍

    介绍

    这个库和RxSwift一起使用,提供action的一个observable的抽象。

    Action接受一个workFactory:接受一些输入,生成一个observable的闭包。当调用execute()时,它将其参数传递给此闭包,并subscrible此工作。

    • 它只能在"enabled"状态被执行(如果未指定,则为true)
    • 一次只执行一件事情
    • 通过单次执行聚合next/error

    而且它有一个非常cool的button,它将管理button的enabled状态,确保在您的工作完成后button被disabled.

    使用

    你必须传递一个workFactory:它接受输入,并返回一个observable。它代表着一些需要被完成的工作。当每次执行execute()是,它会传递输入给workFactory的输入。Action将订阅observable,并在其绑定元素的属性上发送next事件。如果observable出错,这个错误将作为next事件传递给error属性,

    Action一次只能执行一件事情,如果你尝试执行一个现在正在执行的action,则会出现错误。executing属性将true或false值作为Next event传递。

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

    注意,第一个参数是泛型参数的类型,第二个是workFactory创建的observable的类型,你可以把它看做是action的输出。

    你也可以给Action initilizer 指定enabledIf参数:

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

    现在execute()只有在邮箱有效时才会执行. Super Cool!!

    注意enabledIf和enabled property是不一样的,Action将根据传入的enabledIf和当前的执行状态来决定是否是enabled.

    真正cool的是UIButton的扩展,它接受一个CocoaAction,它只是Action<void, void>

    button.rx.action = action

    现在,当按下按钮,操作被执行。这button的enabled状态被绑定到action的enabled属性,这意味着你可以将表单验证逻辑作为信号输入给action,当button为enabled时会自动处理。此外,用户不能在操作执行完毕之前再次点击按钮,因为它一个时间只能处理一个事情。Cool,来看一下CocoaAction的代码示例吧。

    如果你想用Action做一个复杂的操作,例如带有进度条的下载文件(要更新UI中的进度条),你可以用Action<Void, Int> 代替 CocoaAction. 开箱即用的CocoaAction不能发出进度值,而自己的Action<Void, Int>可以发出进度值,详细的信息可以餐卡这篇文章

    如果你的场景涉及许多按钮,它们有不同的输入但触发相同的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会被打印对于相应的tap)

    更复杂的用例是与UIViewController相关的单个Action,像管理你的导航、错误处理和加载状态。使用这种方法,你可以在一个公共位置一次性订阅 executing, errors, elements 和 completions。

    还有一个cool的扩展是在UIAlertAction,被UIAlertController所使用。一个问题是:由于这个类的限制,您不能用普通的初始化器初始化它。相反,请调用如下类方法:

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

    安装

    只需要在你Podfile里添加一行:

    pod 'Action'

    然后运行pod install(它会自动把所依赖的RxSwift和RxCocoa安装好)

    翻译自:https://github.com/RxSwiftCommunity/Action

  • 相关阅读:
    Selenium(十五)---JavaScript的调用
    Selenium(十三)---文件下载
    Selenium(十四)----上传文件
    Selenium(十二)---警告框处理
    Selenium(十一)---获取url与title
    Selenium(十)---模拟键盘操作
    Selenium(九)---模拟鼠标操作
    iOS关于RunLoop和Timer
    iOS关于应用内分享
    iOS内存错误EXC_BAD_ACCESS的解决方法(message sent to deallocated instance)
  • 原文地址:https://www.cnblogs.com/lfri/p/14235349.html
Copyright © 2011-2022 走看看