美文网首页
RxSwift:简单使用1

RxSwift:简单使用1

作者: 文子飞_ | 来源:发表于2020-12-20 22:07 被阅读0次

RxSwift:Rx标准库API的Swift实现,不包括任何iOS相关的内容
RxCocoa:基于RxSwift,给iOS UI控件扩展了很多Rx特性
使用需要 import RxSwift import RxCocoa

Observable:负责发送事件(Event)
Observe:负责订阅Observable,监听Observable发送的事件(Event)

1、RxSwift简单使用

just() 方法

(1)该方法通过传入一个默认值来初始化。
(2)下面样例我们显式地标注出了 observable 的类型为 Observable<Int>,即指定了这个 Observable 所发出的事件携带的数据类型必须是 Int 类型的。

  // element [1,2,3]
   let observable = Observable.just([1,2,3])

of() 方法

(1)该方法可以接受可变数量的参数(必需要是同类型的)
(2)下面样例中我没有显式地声明出 Observable 的泛型类型,Swift 也会自动推断类型。

  // element 1,2,3
   let observable = Observable.of(1, 2, 3)

from() 方法

(1)该方法需要一个数组参数。
(2)下面样例中数据里的元素就会被当做这个 Observable 所发出 event 携带的数据内容,最终效果同上面和 of() 样例是一样的。

  // element 1,2,3
  let observable = Observable.from([1,2,3])

range() 方法

(1)该方法通过指定起始和结束数值,创建一个以这个范围内所有值作为初始值的 Observable 序列。
(2)下面样例中,两种方法创建的 Observable 序列都是一样的。

  //使用range()
  let observable = Observable.range(start: 1, count: 5)
 
  //使用of()
  let observable = Observable.of(1, 2, 3 ,4 ,5)

repeatElement() 方法

该方法创建一个可以无限发出给定元素的 Event 的 Observable 序列(永不终止)。

  let observable = Observable.repeatElement(1)

generate() 方法

(1)该方法创建一个只有当提供的所有的判断条件都为 true 的时候,才会给出动作的 Observable 序列。
(2)下面样例中,两种方法创建的 Observable 序列都是一样的。

//使用generate()方法
let observable = Observable.generate(
    initialState: 0,
    condition: { $0 <= 10 },
    iterate: { $0 + 2 }
)
 
//使用of()方法
let observable = Observable.of(0 , 2 ,4 ,6 ,8 ,10)

create() 方法

enum LFError: Error {
        case rxError
}

static func testRxSwift() {
        
        // 1、创建observable
        let observable = Observable<Int>.create { (observe) -> Disposable in
            // 3、observe发送数据
            observe.onNext(1)
            observe.onNext(2)
            observe.onError(LFError.rxError)
            observe.onCompleted()
            return Disposables.create()
        }
        
        // 2、订阅observable(onNext:闭包表达式,订阅observable发出的数据)
        observable.subscribe(onNext: { (element) in
             print("element = \(element)")
        }, onError: { (error) in
            print("error = \(error)")
        }, onCompleted: {
            print("completed")
        }).dispose() // 马上调用dispose():一次性订阅,只订阅一次
        
        /// disposable调用dispose(),observable发送任何数据,observe都不会再接收到
        let disposable = observable.subscribe { (event) in
            switch event {
            case .next(let element):
                print("element = \(element)")
            case.error(let error):
                print("error = \(error)")
            case .completed:
                print("completed")
            }
        }
        
        disposable.dispose()
        
}

interval() 方法

(1)这个方法创建的 Observable 序列每隔一段设定的时间,会发出一个索引数的元素。而且它会一直发送下去。
(2)下面方法让其每 1 秒发送一次,并且是在主线程(MainScheduler)发送

let observable = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
observable.subscribe { event in
    print(event)

2、timer() 方法,定时器

(1)这个方法有两种用法,一种是创建的 Observable 序列在经过设定的一段时间后,产生唯一的一个元素。

//5秒种后发出唯一的一个元素0
let observable = Observable<Int>.timer(5, scheduler: MainScheduler.instance)
observable.subscribe { event in
    print(event)
}

(2)另一种是创建的 Observable 序列在经过设定的一段时间后,每隔一段时间产生一个元素。

func testRxSwiftTimer() {
        
        /// dueTime:延时时间 period:间隔时间 scheduler:线程
        let observable = Observable<Int>.timer(.seconds(3), period: .seconds(1), scheduler: MainScheduler.instance)
        print("创建observable")
        observable.subscribe(onNext: { (element) in
            print("element = \(element)")
        }, onError: { (error) in
            print("error = \(error)")
        }, onCompleted: {
            print("completed")
        })
        
        /// observable发出的数据,绑定到label上
        /// label.rx.text 是一个observe,订阅observable发出的数据
        observable.map {"数值是:\($0)"}.bind(to: self.label.rx.text)
        
}

2、disposable调用dispose(),observable发送任何数据,observe都不会再接收到

func testRxSwiftDisposable() {
        
        let observable = Observable.just([1,2,3])
        
        /// 立即取消订阅,一次性订阅
        observable.subscribe { (event) in
            print(event)
        }.dispose()
        
        /// 当bag销毁(deinit)时,会自动调用Disposable实例的dispose,observe订阅也跟着销毁
        observable.subscribe { (event) in
            print(event)
        }.disposed(by: bag)
        
        /// RxSwift 给NSObject扩展的 deallocated
        let _ = observable.takeUntil(self.rx.deallocated).subscribe { (event) in
            print(event)
        }
        
}

3、将observable的值,绑定到控件上

func testRxSwiftObserve() {
        
        /// 创建observe
        let observe = AnyObserver<Int>.init { (event) in
            switch event {
            case .next(let element):
                print("element = \(element)")
            case .completed:
                print("completed")
            case .error(let error):
                print("error = \(error)")
            }
        }
        Observable.just(1).subscribe(observe).dispose()
        
        /// 创建observe(Binder也是observe)
        let binderObserve = Binder<String>.init(self.label) { (label, value) in
            label.text = value
        }
        Observable.just(1).map { "数值:\($0)" }.subscribe(binderObserve).dispose()
        Observable.just(1).map { "数值:\($0)" }.bind(to: binderObserve).dispose()
        
        /// 将observable的值,绑定到button上
        /// self.button.rx.isHidden self.button.rx.enable是一个observe,订阅(subscribe/bind)observable发出的数据
        let observable = Observable<Int>.timer(.seconds(3), period: .seconds(1), scheduler: MainScheduler.instance)
        let binderObserve = Binder<Bool>.init(self.button) { (button, value) in
            // 业务逻辑
            button.isHidden = value
        }
        observable.map { $0 % 2 == 0 }.bind(to: binderObserve).disposed(by: bag)
        observable.map { $0 % 2 == 0 }.bind(to: self.button.rx.isHidden).disposed(by: bag)
        observable.map { $0 % 2 == 0 }.bind(to: self.button.rx.enable).disposed(by: bag)
        
}

/// 给rx前缀扩展isHidden、enable计算属性
extension Reactive where Base: UIButton {
    var isHidden: Binder<Bool> {
        return Binder<Bool>(base) { (button, value) in
            button.isHidden = value
        }
    }
    var enable: Binder<Bool> {
        return Binder<Bool>(base) { (button, value) in
            button.isEnabled = value
        }
    }
}

4、observable create操作符。

传入一个观察者observer,然后调用observer的onNext,onCompleted和onError方法。返回一个可观察的obserable序列

func testObservableCreate() {
        
        // subscribe(_ on:) 订阅信号
        let observable1 = Observable<Any>.create { ( anyObserver: AnyObserver) -> Disposable in
            anyObserver.onNext("1")
            anyObserver.onNext("12")
            anyObserver.onNext("123")
            anyObserver.onCompleted()
            return Disposables.create()
        }
        observable1.subscribe { (any) in
            debugPrint("any = \(any)")
        }.disposed(by: self.disposeBag)
        /**
         *  "any = next(1)"
         *  "any = next(12)"
         *  "any = next(123)"
         *  "any = completed"
         */
        
        
        // subscribe(onNext:) 订阅值
        let observable2 = Observable<String>.create { ( anyObserver:AnyObserver<String>) -> Disposable in
            anyObserver.onNext("1")
            anyObserver.onNext("12")
            anyObserver.onNext("123")
            anyObserver.onCompleted()
            return Disposables.create()
        }.subscribe(onNext: { (string) in
            print("string = \(string)")
        }).disposed(by: self.disposeBag)
        /**
         *  string = 1
         *  string = 12
         *  string = 123
         */
        
        
        /**
         *  ReplaySubject:可以接收到订阅他之后的事件,但也可以接受订阅他之前发出的事件,接受几个事件取决与bufferSize的大小
         *  createUnbounded()表示接受所有事件
         *  create(bufferSize: 1) 表示可接受到的订阅他之前的事件的个数
         */
        let replaySubject = ReplaySubject<String>.createUnbounded()
        let replaySubject = ReplaySubject<String>.create(bufferSize: 1)
        replaySubject.onNext("1")
        replaySubject.onNext("12")

        replaySubject.subscribe(onNext: { (string) in
            debugPrint("string = \(string)")
        }).disposed(by: self.disposeBag)

        replaySubject.onNext("123")
        replaySubject.onCompleted()
        /**
         *  create(bufferSize: 1)
         *  "string = 12"
         *  "string = 123"
         */
        
        
        /**
         *  当你订阅了BehaviorSubject,你会接受到订阅之前的最后一个事件,订阅之后的事件一定会触发
         */
        let behaviorSubject = BehaviorSubject<String>.init(value: "1")
        behaviorSubject.onNext("12")

        behaviorSubject.subscribe(onNext: { (string) in
            debugPrint("string = \(string)")
        }).disposed(by: self.disposeBag)

        behaviorSubject.onNext("123")
        behaviorSubject.onCompleted()
        /**
         *  "string = 12"
         *  "string = 123"
         */
        
    }

RxSwift中文文档

为什么要使用 RxSwift ?:https://beeth0ven.github.io/RxSwift-Chinese-Documentation

相关文章

网友评论

      本文标题:RxSwift:简单使用1

      本文链接:https://www.haomeiwen.com/subject/yaacnktx.html