ReactiveX

RxSwift(1)-初识RxSwift

2020-04-14  本文已影响0人  xxxxxxxx_123

简介

Rx简介

RxSwiftRx家族对swift语言的封装。什么是Rx呢?全称是ReactiveX。官方对自己的定义如下:

An API for asynchronous programming with observable streams

一组带有可观察流的异步编程APIReactiveX结合了观察者模式(Observer pattern)、迭代器模式(Iterator pattern)、函数式编程(functional programming)的思想。

ReactiveX通过使用可观察的序列来组合异步和基于事件的程序。它扩展了观察者模式以支持数据和事件序列,并且允许使用运算符将各种序列组合起来处理。这样不仅简化了异步事件响应的复杂度,同时消除了低级线程、同步、线程安全、并发数据结构等问题。

RxSwift简介

RxSwift作为Rx的一员,它结合了传统Cocoa编程和纯函数编程的优点。它允许对事件作出反应,方法是使用不可变的代码定义以确定性的、可组合的方式处理异步输入部分。

RxSwift的核心组成部分如下:

可以说Observable就是Rx的基础:任何事件或者任务的执行都可以携带信号,而这些信号又可以被任何订阅了类或者对象使用。不管是同步或者异步,只要是信号发出,订阅者必然能够接受到。

RxSwift的事件类型分为以下三种:

RxSwift简单使用

RxSwift对很多事件和机制都做了封装,可以更方便的使用

KVO

func testKVO() {
    self.person.rx.observeWeakly(String.self, "name")
        .subscribe(onNext: { (value) in
            print(value ?? "")
        })
        .disposed(by: disposeBag)
}

Notification

func testNotification(){
    NotificationCenter.default.rx.notification(UIResponder.keyboardWillShowNotification)
        .subscribe(onNext: { (noti) in
            print(noti)
        })
        .disposed(by: disposeBag)
}

Delegate

func testScrollerView() {
    scrollView.rx.contentOffset
        .subscribe(onNext: { [weak self](content) in
            print(content)
        })
        .disposed(by: disposeBag)
}

UI事件响应

UITextField

UITextField响应代理:

func testTextFiled() {
    self.textFiled.rx.text.orEmpty
        .subscribe(onNext: { (text) in
            print(text)
        })
        .disposed(by: disposeBag)
}

控件绑定,将输入框的文案,绑定到按钮上。

self.textFiled.rx.text
        .bind(to: self.button.rx.title())
        .disposed(by: disposeBag)

UIButton

func testButton() {
    self.button.rx.tap
        .subscribe(onNext: { () in
            print("点击事件")
        })
        .disposed(by: disposeBag)
    // 修改button的事件类型
    self.button.rx.controlEvent(.touchUpOutside)
}

UIGestureRecognizer

func testGestureRecognizer(){
    let tap = UITapGestureRecognizer()
    self.label.addGestureRecognizer(tap)
    self.label.isUserInteractionEnabled = true
    tap.rx.event.subscribe(onNext: { (tap) in
        print(tap)
    })
    .disposed(by: disposeBag)
}

定时器

RxSwift封装了定时器,该定时器并不会受到scrollView滑动的影响。它并不是对NSTimer的封装。

func testTimer() {
    let timer = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
    timer.subscribe(onNext: { (num) in
        print(num)
    })
    .disposed(by: disposeBag)
}

网络请求

func testNextwork() {
    let url = URL(string: "")
    URLSession.shared.rx.response(request: URLRequest(url: url!))
        .subscribe(onNext: { (response,data) in
            print(response)
        })
        .disposed(by: disposeBag)
}

从上述的例子可以看到,我们的对象在实例化之后都有rx这个属性,那么这是为什么呢?其实这是因为在RxSwift中给NSObject实现了ReactiveCompatible协议,所以能获取到rx这个属性。

public protocol ReactiveCompatible {
    /// Extended type
    associatedtype CompatibleType

    /// Reactive extensions.
    static var rx: Reactive<CompatibleType>.Type { get set }

    /// Reactive extensions.
    var rx: Reactive<CompatibleType> { get set }
}

extension NSObject: ReactiveCompatible { }

使用RxSwift的必要性

swift是一门静态语言,Objective-C的很多动态特性是无法使用的,而RxSwift则很好的弥补这个缺点。总结一下,RxSwift有以下优点

上一篇 下一篇

猜你喜欢

热点阅读