RxSwiftiOS 进阶开发Swift开发进阶

RxSwift-高阶函数(下)

2019-08-13  本文已影响18人  Cooci_和谐学习_不急不躁

就问此时此刻还有谁?45度仰望天空,该死!我这无处安放的魅力!


RxSwift目录直通车--- 和谐学习,不急不躁!


这一篇文章继续上一篇:RxSwift-高阶函数(上)给大家介绍 RxSwift 非常重要的高阶函数,也不多说,开始介绍

5:从可观察对象的错误通知中恢复的操作符

5.1:catchErrorJustReturn

print("*****catchErrorJustReturn*****")
let sequenceThatFails = PublishSubject<String>()

sequenceThatFails
    .catchErrorJustReturn("Cooci")
    .subscribe { print($0) }
    .disposed(by: disposeBag)

sequenceThatFails.onNext("Hank")
sequenceThatFails.onNext("Kody") // 正常序列发送成功的
//发送失败的序列,一旦订阅到位 返回我们之前设定的错误的预案
sequenceThatFails.onError(self.lgError) 

5.2:catchError

print("*****catchError*****")
let recoverySequence = PublishSubject<String>()

sequenceThatFails
    .catchError {
        print("Error:", $0)
        return recoverySequence  // 获取到了错误序列-我们在中间的闭包操作处理完毕,返回给用户需要的序列(showAlert)
    }
    .subscribe { print($0) }
    .disposed(by: disposeBag)

sequenceThatFails.onNext("Hank")
sequenceThatFails.onNext("Kody") // 正常序列发送成功的
sequenceThatFails.onError(lgError) // 发送失败的序列

recoverySequence.onNext("CC")

5.3:retry

print("*****retry*****")
var count = 1 // 外界变量控制流程
let sequenceRetryErrors = Observable<String>.create { observer in
    observer.onNext("Hank")
    observer.onNext("Kody")
    observer.onNext("CC")
    
    if count == 1 { 
        // 流程进来之后就会过度-这里的条件可以作为出口,失败的次数
        observer.onError(self.lgError)  // 接收到了错误序列,重试序列发生
        print("错误序列来了")
        count += 1
    }
    
    observer.onNext("Lina")
    observer.onNext("小雁子")
    observer.onNext("婷婷")
    observer.onCompleted()
    
    return Disposables.create()
}

sequenceRetryErrors
    .retry()
    .subscribe(onNext: { print($0) })
    .disposed(by: disposeBag)

5.4:retry(_:):

print("*****retry(_:)*****")
let sequenceThatErrors = Observable<String>.create { observer in
    observer.onNext("Hank")
    observer.onNext("Kody")
    observer.onNext("CC")
    
    if count < 5 { // 这里设置的错误出口是没有太多意义的额,因为我们设置重试次数
        observer.onError(self.lgError)
        print("错误序列来了")
        count += 1
    }
    
    observer.onNext("Lina")
    observer.onNext("小雁子")
    observer.onNext("婷婷")
    observer.onCompleted()
    
    return Disposables.create()
}

sequenceThatErrors
    .retry(3)
    .subscribe(onNext: { print($0) })
    .disposed(by: disposeBag)

6:Rx流程操作符。

6.1:debug

print("*****debug*****")
var count = 1

let sequenceThatErrors = Observable<String>.create { observer in
    observer.onNext("Hank")
    observer.onNext("Kody")
    observer.onNext("CC")
    
    if count < 5 {
        observer.onError(self.lgError)
        print("错误序列来了")
        count += 1
    }
    
    observer.onNext("Lina")
    observer.onNext("小雁子")
    observer.onNext("可心")
    observer.onCompleted()
    
    return Disposables.create()
}

sequenceThatErrors
    .retry(3)
    .debug()
    .subscribe(onNext: { print($0) })
    .disposed(by: disposeBag)

6.2: RxSwift.Resources.total:

print("*****RxSwift.Resources.total*****")

print(RxSwift.Resources.total)

let subject = BehaviorSubject(value: "Cooci")

let subscription1 = subject.subscribe(onNext: { print($0) })

print(RxSwift.Resources.total)

let subscription2 = subject.subscribe(onNext: { print($0) })

print(RxSwift.Resources.total)

subscription1.dispose()

print(RxSwift.Resources.total)

subscription2.dispose()

print(RxSwift.Resources.total)

7:链接操作符

7.1:multicast

func testMulticastConnectOperators(){
    print("*****multicast*****")
    let subject = PublishSubject<Any>()
    subject.subscribe{print("00:\($0)")}
        .disposed(by: disposeBag)
    
    let netOB = Observable<Any>.create { (observer) -> Disposable in
            sleep(2)// 模拟网络延迟
            print("我开始请求网络了")
            observer.onNext("请求到的网络数据")
            observer.onNext("请求到的本地")
            observer.onCompleted()
            return Disposables.create {
                print("销毁回调了")
            }
        }.publish()
    
    netOB.subscribe(onNext: { (anything) in
            print("订阅1:",anything)
        })
        .disposed(by: disposeBag)

    // 我们有时候不止一次网络订阅,因为有时候我们的数据可能用在不同的额地方
    // 所以在订阅一次 会出现什么问题?
    netOB.subscribe(onNext: { (anything) in
            print("订阅2:",anything)
        })
        .disposed(by: disposeBag)
    
    _ = netOB.connect()
}

7.2:replay

func testReplayConnectOperators(){   
    print("*****replay*****")

    let interval = Observable<Int>.interval(.seconds(1), scheduler: MainScheduler.instance).replay(5)
    
    interval.subscribe(onNext: { print(Date.time,"订阅: 1, 事件: \($0)") })
        .disposed(by: self.disposeBag)
    
    delay(2) { _ = interval.connect() }
    
    delay(4) {
        interval.subscribe(onNext: { print(Date.time,"订阅: 2, 事件: \($0)") })
            .disposed(by: self.disposeBag)
    }
    
    delay(8) {
        interval.subscribe(onNext: { print(Date.time,"订阅: 3, 事件: \($0)") })
            .disposed(by: self.disposeBag)
    }
    delay(20, closure: {
        self.disposeBag = DisposeBag()
    })
    
    /**
     订阅: 1, 事件: 4
     订阅: 1, 事件: 0
     2019-05-28 21-32-42 订阅: 2, 事件: 0
     2019-05-28 21-32-42 订阅: 1, 事件: 1
     2019-05-28 21-32-42 订阅: 2, 事件: 1
     2019-05-28 21-32-45 订阅: 2, 事件: 4
     2019-05-28 21-32-46 订阅: 3, 事件: 0
     2019-05-28 21-32-46 订阅: 3, 事件: 1
     2019-05-28 21-32-46 订阅: 3, 事件: 2
     2019-05-28 21-32-46 订阅: 3, 事件: 3
     2019-05-28 21-32-46 订阅: 3, 事件: 4
     
     // 序列从 0开始
     // 定时器也没有断层  sub2 sub3 和 sub1 是同步的
     */
}

高阶函数的用法还是有点意思的!如果你是一个RxSwift新手,还是非常建议大家耐着性子好好练习,对你的开发绝对有帮助!

就问此时此刻还有谁?45度仰望天空,该死!我这无处安放的魅力!

上一篇 下一篇

猜你喜欢

热点阅读