RxViewBinder
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+
安装
- 针对iOS 9+项目,使用 CocoaPods
pod 'RxViewBinder', '~> 1.0.0'
- 针对iOS 9+项目,使用 Carthage
github "magi82/RxViewBinder" ~> 1.0.0
作者
magi82, [email protected]
许可证
RxViewBinder 遵循 MIT 许可证。更多详情请参见 LICENSE 文件。