RxSwift(5)—— 高階函數(shù)(上)

就問(wèn)此時(shí)此刻還有誰(shuí)脐恩?45度仰望天空镐侯,該死!我這無(wú)處安放的魅力驶冒!


RxSwift目錄直通車--- 和諧學(xué)習(xí)苟翻,不急不躁!


這一篇文章繼續(xù)上一篇:RxSwift-高階函數(shù)(上)給大家介紹 RxSwift 非常重要的高階函數(shù)骗污,也不多說(shuō)崇猫,開(kāi)始介紹

5:從可觀察對(duì)象的錯(cuò)誤通知中恢復(fù)的操作符

5.1:catchErrorJustReturn

  • 從錯(cuò)誤事件中恢復(fù),方法是返回一個(gè)可觀察到的序列需忿,該序列發(fā)出單個(gè)元素诅炉,然后終止
print("*****catchErrorJustReturn*****")
let sequenceThatFails = PublishSubject<String>()

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

sequenceThatFails.onNext("Hank")
sequenceThatFails.onNext("Kody") // 正常序列發(fā)送成功的
//發(fā)送失敗的序列,一旦訂閱到位 返回我們之前設(shè)定的錯(cuò)誤的預(yù)案
sequenceThatFails.onError(self.lgError) 

5.2:catchError

  • 通過(guò)切換到提供的恢復(fù)可觀察序列,從錯(cuò)誤事件中恢復(fù)
print("*****catchError*****")
let recoverySequence = PublishSubject<String>()

sequenceThatFails
    .catchError {
        print("Error:", $0)
        return recoverySequence  // 獲取到了錯(cuò)誤序列-我們?cè)谥虚g的閉包操作處理完畢,返回給用戶需要的序列(showAlert)
    }
    .subscribe { print($0) }
    .disposed(by: disposeBag)

sequenceThatFails.onNext("Hank")
sequenceThatFails.onNext("Kody") // 正常序列發(fā)送成功的
sequenceThatFails.onError(lgError) // 發(fā)送失敗的序列

recoverySequence.onNext("CC")

5.3:retry

  • 通過(guò)無(wú)限地重新訂閱可觀察序列來(lái)恢復(fù)重復(fù)的錯(cuò)誤事件
print("*****retry*****")
var count = 1 // 外界變量控制流程
let sequenceRetryErrors = Observable<String>.create { observer in
    observer.onNext("Hank")
    observer.onNext("Kody")
    observer.onNext("CC")
    
    if count == 1 { 
        // 流程進(jìn)來(lái)之后就會(huì)過(guò)度-這里的條件可以作為出口,失敗的次數(shù)
        observer.onError(self.lgError)  // 接收到了錯(cuò)誤序列,重試序列發(fā)生
        print("錯(cuò)誤序列來(lái)了")
        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(_:):

  • 通過(guò)重新訂閱可觀察到的序列屋厘,重復(fù)地從錯(cuò)誤事件中恢復(fù)涕烧,直到重試次數(shù)達(dá)到max未遂計(jì)數(shù)
print("*****retry(_:)*****")
let sequenceThatErrors = Observable<String>.create { observer in
    observer.onNext("Hank")
    observer.onNext("Kody")
    observer.onNext("CC")
    
    if count < 5 { // 這里設(shè)置的錯(cuò)誤出口是沒(méi)有太多意義的額,因?yàn)槲覀冊(cè)O(shè)置重試次數(shù)
        observer.onError(self.lgError)
        print("錯(cuò)誤序列來(lái)了")
        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("錯(cuò)誤序列來(lái)了")
        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:

  • 提供所有Rx資源分配的計(jì)數(shù),這對(duì)于在開(kāi)發(fā)期間檢測(cè)泄漏非常有用仲翎。
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

  • 將源可觀察序列轉(zhuǎn)換為可連接序列痹扇,并通過(guò)指定的主題廣播其發(fā)射。
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)// 模擬網(wǎng)絡(luò)延遲
            print("我開(kāi)始請(qǐng)求網(wǎng)絡(luò)了")
            observer.onNext("請(qǐng)求到的網(wǎng)絡(luò)數(shù)據(jù)")
            observer.onNext("請(qǐng)求到的本地")
            observer.onCompleted()
            return Disposables.create {
                print("銷毀回調(diào)了")
            }
        }.publish()
    
    netOB.subscribe(onNext: { (anything) in
            print("訂閱1:",anything)
        })
        .disposed(by: disposeBag)

    // 我們有時(shí)候不止一次網(wǎng)絡(luò)訂閱,因?yàn)橛袝r(shí)候我們的數(shù)據(jù)可能用在不同的額地方
    // 所以在訂閱一次 會(huì)出現(xiàn)什么問(wèn)題?
    netOB.subscribe(onNext: { (anything) in
            print("訂閱2:",anything)
        })
        .disposed(by: disposeBag)
    
    _ = netOB.connect()
}
  • 底層邏輯探索中間變量ConnectableObservableAdapter保存了源序列source溯香、中間序列makeSubject
  • 訂閱流程self.lazySubject.subscribe(observer)一個(gè)懶加載的序列鲫构,保證了中間變量ConnectableObservableAdapter每一次都是同一個(gè)響應(yīng)序列
  • 剩下就是PublishSubject的訂閱效果
  • 完事等待源序列的響應(yīng),但是我們的源序列的訂閱是在connect函數(shù)里面玫坛!如果沒(méi)有調(diào)用connect函數(shù)结笨,意味著就永遠(yuǎn)不會(huì)發(fā)送響應(yīng)。這樣背后的邏輯就是湿镀,前面所以的發(fā)送響應(yīng)在connect函數(shù)之前的都沒(méi)有任何的意義炕吸!
  • 以上也就說(shuō)明了我們的publish就是狀態(tài)共享的:connnect一次我們序列發(fā)送一次響應(yīng)(響應(yīng)所有訂閱)。

7.2:replay

  • 將源可觀察序列轉(zhuǎn)換為可連接的序列勉痴,并將向每個(gè)新訂閱服務(wù)器重放以前排放的緩沖大小
  • 首先擁有和publish一樣的能力赫模,共享 Observable sequence, 其次使用replay還需要我們傳入一個(gè)參數(shù)(buffer size)來(lái)緩存已發(fā)送的事件蒸矛,當(dāng)有新的訂閱者訂閱了瀑罗,會(huì)把緩存的事件發(fā)送給新的訂閱者
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開(kāi)始
     // 定時(shí)器也沒(méi)有斷層  sub2 sub3 和 sub1 是同步的
     */
}

高階函數(shù)的用法還是有點(diǎn)意思的胸嘴!如果你是一個(gè)RxSwift新手,還是非常建議大家耐著性子好好練習(xí)斩祭,對(duì)你的開(kāi)發(fā)絕對(duì)有幫助!

就問(wèn)此時(shí)此刻還有誰(shuí)劣像?45度仰望天空,該死摧玫!我這無(wú)處安放的魅力耳奕!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市诬像,隨后出現(xiàn)的幾起案子吮铭,更是在濱河造成了極大的恐慌,老刑警劉巖颅停,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谓晌,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡癞揉,警方通過(guò)查閱死者的電腦和手機(jī)纸肉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)喊熟,“玉大人柏肪,你說(shuō)我怎么就攤上這事〗媾疲” “怎么了烦味?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)壁拉。 經(jīng)常有香客問(wèn)我谬俄,道長(zhǎng),這世上最難降的妖魔是什么弃理? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任溃论,我火速辦了婚禮,結(jié)果婚禮上痘昌,老公的妹妹穿的比我還像新娘钥勋。我一直安慰自己,他們只是感情好辆苔,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布算灸。 她就那樣靜靜地躺著,像睡著了一般驻啤。 火紅的嫁衣襯著肌膚如雪菲驴。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,007評(píng)論 1 284
  • 那天街佑,我揣著相機(jī)與錄音谢翎,去河邊找鬼。 笑死沐旨,一個(gè)胖子當(dāng)著我的面吹牛森逮,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播磁携,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼褒侧,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了谊迄?” 一聲冷哼從身側(cè)響起闷供,我...
    開(kāi)封第一講書(shū)人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎统诺,沒(méi)想到半個(gè)月后歪脏,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡粮呢,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年婿失,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片啄寡。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡豪硅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出挺物,到底是詐尸還是另有隱情懒浮,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布识藤,位于F島的核電站砚著,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏痴昧。R本人自食惡果不足惜赖草,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望剪个。 院中可真熱鬧秧骑,春花似錦、人聲如沸扣囊。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)侵歇。三九已至骂澄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間惕虑,已是汗流浹背坟冲。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工磨镶, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人健提。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓琳猫,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親私痹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子脐嫂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容