RxViewBinder 2.0.0

RxViewBinder 2.0.0

magi维护。



 
依赖
RxSwift~> 5.0
RxCocoa~> 5.0
 

  • magi82

RxViewBinder

Swift Platform Version Carthage compatible License

RxViewBinder 是一个简单的单向架构。
简单且易于实现。☀️

它实现为一个响应式扩展。

流程

用法(ViewBindable)

  • 创建一个实现 ViewBindable 的 ViewBinder 类。
    必须实现命令、操作和状态。
    命令是枚举类型。
    操作和状态是结构体类型。

重要!!
您需要在状态结构体的构造器中将操作和状态绑定。

final class SampleViewBinder: ViewBindable {
  
  enum Command {
    case fetch
  }
  
  struct Action {
    let value: PublishRelay<String> = PublishRelay()
  }
  
  struct State {
    let value: Driver<String>
    
    init(action: Action) {
      // Action and state binding
      value = action.value.asDriver(onErrorJustReturn: "")
    }
  }
  
  let action = Action()
  lazy var state = State(action: self.action)
}
  • 实现一个接受命令流并将流发送到操作的绑定方法。
    当更改 UI 的状态时,仅使用操作。
    仅在视图接收到 UI 的状态时使用状态。
  func binding(command: Command) {
    switch command {
    case .fetch:
      Observable<String>.just("test")
        .bind(to: action.value)
        .disposed(by: self.disposeBag)
    }
  }
  • 或者您可以直接发送流而不创建观察者。
  func binding(command: Command) {
    switch command {
    case .fetch:
      action.value.accept("test")
    }
  }

用法(BindView)

  • 在视图控制器上实现 BindView 协议。
    它在初始化时注入视图绑定器。
final class ViewController: UIViewController, BindView {

  typealias ViewBinder = SampleViewBinder
  
  init(viewBinder: ViewBinder) {
    defer { self.viewBinder = viewBinder }
    
    super.init(nibName: nil, bundle: nil)
  }
}
  • 如果您正在使用 Storyboard,您必须以不同的方式注入它。
  let vc = ViewController()
  vc.viewBinder = SampleViewBinder()

或者

  required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    
    self.viewBinder = ViewBinder()
  }
  • 实现命令和状态的方法。
  func command(viewBinder: ViewBinder) {
    self.rx.methodInvoked(#selector(UIViewController.viewDidLoad))
      .map { _ in ViewBinder.Command.fetch }
      .bind(to: viewBinder.command)
      .disposed(by: self.disposeBag)
  }
  
  func state(viewBinder: ViewBinder) {
    viewBinder.state
      .value
      .drive(onNext: { print($0) })
      .disposed(by: self.disposeBag)
  }

需求

  • Swift 4.0+
  • iOS 9.0+

安装

pod 'RxViewBinder', '~> 1.0.0'
github "magi82/RxViewBinder" ~> 1.0.0

作者

magi82, [email protected]

许可证

RxViewBinder 遵循 MIT 许可证。更多详情请参见 LICENSE 文件。