RXswiftRxSwift学习程序员

RxSwift4.0初体验(一)

2017-11-24  本文已影响331人  Iam光星人

简介

时隔1年,随着项目的推移和时间的变迁,swift语言的不断完善和进步,我们技术方向也随之改变,由之前的oc逐渐在项目中全面的使用swift的,我们在oc版本已经很成熟的使用响应式编程框架,所以在swift希望继续沿用,而且之前在swift中3.0版本有使用的经验,所以本次我们直接采用最新版本rxswift4.0进行开发,在这里我们只对基本的方法进行分析和演练,足以满足正常开发。
相信再好的描述抵不过自己编写运行体会的深刻,所以我直接开门见山,直接上代码。

Observable(被观察者)

RxSwift中的Observable 是观察者模式中被观察的对象,相当于一个事件序列 (GeneratorType) ,会主动向订阅者发送新产生的事件信息。事件类型分为以下三种:

.onNext(element) 表示新的事件数据。
.onError(error) 表示事件序列因异常而完结。
.onCompleted() 表示事件序列完结。

Subscribe(订阅者)

如果只有一个Observable被创建,而没有被任何的订阅者所订阅的话,那么什么事情都不会发生。所以我们需要创建一个订阅者,来响应事件的触发。

1、创建信号——>订阅

//创建信号
 var single1 = Observable<String>.create { (result) -> Disposable in
        print("create")
        result.onNext("1")
        result.onCompleted()
        return Disposables.create()
    }
 //订阅信号
    func singleFoucation() -> Void {
        single1.subscribe(onNext: { (result) in
            print(result)
        }, onError: nil, onCompleted: {
            print("onCompleted1")
        }) {
            print("onDisposed1")
        }.disposed(by: self.disposeBag)
        
    }
//这里可以代替跨页面的传值(block)

2、空信号只会返回onCompleted信号

var single2 = Observable<Any>.empty()
//空信号只会返回onCompleted信号
    func singleFoucation2() -> Void {
        single2.subscribe(onNext: { (reslute) in
            print(reslute)
        }, onError: nil, onCompleted: {
            print("onCompleted2")
        }, onDisposed: nil).disposed(by: self.disposeBag)
    }
//这里可以代替点击事件的跨页面响应(block)

3、just信号(快速创建信号,可完全代替block传值)

var single3 = Observable<String>.just("just")
//just信号
    func singleFoucation3() -> Void {
        single3.subscribe(onNext: { (reslute) in
            print(reslute)
        }, onError: nil, onCompleted: {
            print("onCompleted3")
        }, onDisposed: nil).disposed(by: self.disposeBag)
    }

4、of序列(依次进行输出,可结合map,filter)

var single4 = Observable<Any>.of("1",["1":2],3,"4")
 //of序列
    func singleFoucation4() -> Void {
        single4.subscribe(onNext: { (reslute) in
            print(reslute)
        }, onError: nil, onCompleted: {
            print("onCompleted4")
        }, onDisposed: nil).disposed(by: self.disposeBag)
    }

5、from序列(从一个序列创建一个可被观察的序列。这里使用$0表示默认的第一个参数,个人感觉完全可以用of代替)

 var single5 = Observable<Any>.from(["1",["1":2],3,"4"])
//from序列
    func singleFoucation5() -> Void {
        single5.subscribe(onNext: { (reslute) in
            print(reslute)
        }, onError: nil, onCompleted: {
            print("onCompleted5")
        }, onDisposed: nil).disposed(by: self.disposeBag)
    }

6、range序列(创建一个发出一系列顺序整数然后终止的序列)

var single6 = Observable.range(start: 0, count: 10)
//range序列
    func singleFoucation6() -> Void {
        single6.subscribe(onNext: { (reslute) in
            print(reslute)
        }, onError: nil, onCompleted: {
            print("onCompleted6")
        }, onDisposed: nil).disposed(by: self.disposeBag)
    }

7、generate序列 (创建一个满足条件的序列,可以类比for循环)

var single7 = Observable.generate(initialState: 0, condition: { (result) -> Bool in
        return result < 10
    }, iterate:{$0+1})
//generate序列
    func singleFoucation7() -> Void {
        single7.subscribe(onNext: { (reslute) in
            print(reslute)
        }, onError: nil, onCompleted: {
            print("onCompleted7")
        }, onDisposed: nil).disposed(by: self.disposeBag)
    }

8、of序列do(只读,可类比for in循环)

var single8 = Observable<Any>.of("1",["1":2],3,"4").do(onNext: { (result) in
        print(result)
    }, onError: nil, onCompleted: nil, onSubscribe: nil, onSubscribed: nil, onDispose: nil)
//do
    func singleFoucation8() -> Void {
        single8.subscribe(onNext: { (reslute) in
            print(reslute)
        }, onError: nil, onCompleted: {
            print("onCompleted7")
        }, onDisposed: nil).disposed(by: self.disposeBag)
    }
//do
    func singleFoucation8() -> Void {
        single8.subscribe(onNext: { (reslute) in
            print(reslute)
        }, onError: nil, onCompleted: {
            print("onCompleted8")
        }, onDisposed: nil).disposed(by: self.disposeBag)
    }

9、subject(Subject就相当于一个桥梁或者代理,它既可以作为一个observer也可以作为一个Observable)功能可类比just信号

let subject = PublishSubject<String>()
 //subject
    func singleFoucation9() -> Void {
        subject.asObserver().onNext("abcd")
    }
    func singleFoucation10() -> Void {
        subject.subscribe(onNext: { (result) in
            print(result)
        }, onError: nil, onCompleted: nil, onDisposed: nil).disposed(by: self.disposeBag)
    }

10、Variable(Variable是BehaviorSubject的封装,它和BehaviorSubject不同之处在于,不能向Variable发送.Complete和.Error,它会在生命周期结束被释放的时候自动发送.Complete)

BehaviorSubject(广播所有事件给订阅者,对于新的订阅者,广播最近的一个事件或者默认值)

[unowned self] 防止循环引用

var smsCodeMsg:Variable = Variable("123")
self.smsCodeMsg.asObservable().subscribe(onNext: { [unowned self] (message) in
                self.textField.errorMessage = message
            }, onError: nil).disposed(by: disposeBag)

未完待续(http://www.jianshu.com/p/246f676efc44

上一篇 下一篇

猜你喜欢

热点阅读