最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

RxSwift使用技巧之過濾操作詳解

 更新時間:2017年09月20日 10:18:11   作者:BigNerdCoding  
RxSwift的目的是讓讓數(shù)據(jù)/事件流和異步任務(wù)能夠更方便的序列化處理,能夠使用Swift進(jìn)行響應(yīng)式編程,下面這篇文章主要給大家介紹了關(guān)于RxSwift使用技巧之過濾操作的相關(guān)資料,需要的朋友可以參考下。

前言

在前面的基礎(chǔ)之上接下來我會介紹一些常用的函數(shù)和實用技巧。首先,本文將會介紹那些用于對 next 事件進(jìn)行過濾的操作。這些過濾操作類似于 Swift 標(biāo)準(zhǔn)庫中的 filter 操作。它能在我們開始真正進(jìn)行業(yè)務(wù)處理前先把那些不符合條件的過濾掉,而且這種函數(shù)式編程的范式也能開闊我們的思維。

Ignore 過濾

RxSwift 中最簡單直接的過濾操作就是 ignoreElements 了。該操作會屏蔽所有的 next 事件,只會將注意力放在 error 和 completed 事件上。如下圖所示,在整個生命周期中可觀察對象的所有 next 都被過濾。

示例代碼:

let strikes = PublishSubject<String>()
 
let disposeBag = DisposeBag()

strikes
 .ignoreElements()
 .subscribe { _ in
 print("You're out!")
 }
 .addDisposableTo(disposeBag)
 
strikes.onNext("X")
strikes.onNext("X")
strikes.onNext("X")
 
strikes.onCompleted()

/* 打印結(jié)果
You're out!
*/

不過相比于殘暴的全部過濾,有時候我們可能只是需要過濾某些特定的事件。例如,我們可以通過 elementAt 對特定索引號 next 進(jìn)行過濾。下圖演示了只響應(yīng)第二個 next 事件的 elementAt 操作。

與之相應(yīng)的代碼為:

let strikes = PublishSubject<String>()
 
let disposeBag = DisposeBag()
 
strikes
 .elementAt(2)
 .subscribe(onNext: { str in
 print(str)
 })
 .addDisposableTo(disposeBag)
 
strikes.onNext("1")
strikes.onNext("2")
strikes.onNext("3")
 
strikes.onCompleted()

/* 打印結(jié)果
3
*/

上面兩個操作最后針對的 next 事件最多只會有一個,但是大多數(shù)時候我們其實需要篩選出一組符合條件的 next 事件。下圖演示的就是使用 filter 篩選數(shù)據(jù)小于 3 的操作。

圖示對應(yīng)代碼如下:

let strikes = PublishSubject<Int>()
 
let disposeBag = DisposeBag()
 
strikes
 .filter{ $0 < 3 }
 .subscribe(onNext: { num in
 print("\(num)")
 })
 .addDisposableTo(disposeBag)
 
strikes.onNext(1)
strikes.onNext(2)
strikes.onNext(3)
strikes.onNext(4)
strikes.onNext(5)
 
strikes.onCompleted()

/* 打印結(jié)果
1
2
*/

Skip 過濾

除了忽略操作外,另一個常見的過濾就是跳過操作了。在所有的跳過操作中,最簡單的就屬 skip 了。通過設(shè)定參數(shù),我們就能和簡單實現(xiàn)跳過指定個數(shù)的事件。例如,下圖久演示跳過前兩個事件的操作。

let strikes = PublishSubject<Int>()
 
let disposeBag = DisposeBag()
 
strikes
 .skip(2)
 .subscribe(onNext: { num in
 print("\(num)")
 })
 .addDisposableTo(disposeBag)
 
strikes.onNext(1)
strikes.onNext(2)
strikes.onNext(3)
strikes.onNext(4)
strikes.onNext(5)
 
strikes.onCompleted()

/* 打印結(jié)果
3
4
5
*/

當(dāng)然除了跳過指定索引號的事件之外,我們依舊通過 skipWhile 我們能夠?qū)崿F(xiàn)類似 filter 類似的操作。只不過 filter 會過濾整個生命周期內(nèi)的符合條件的事件,而 skipWhile 在找到第一個不符合跳過操作的事件之后就不再工作。例如,下圖 skipWhile 的條件是數(shù)據(jù)為奇數(shù)就跳過,但是當(dāng)數(shù)據(jù) 2 執(zhí)行之后 數(shù)據(jù) 3 雖然也是奇數(shù)但是不會在跳過。所以嚴(yán)格意義上來說 skipWhile 可能有點歧義,實際是它會跳過所有符合條件的事件,直到找到第一個能執(zhí)行事件后就不再生效。

下面是跳過偶數(shù)的 skipWhile 代碼:

let strikes = PublishSubject<Int>()
 
let disposeBag = DisposeBag()
 
strikes
 .skipWhile{ num in
  num % 2 == 0
 }
 .subscribe(onNext: { num in
 print("\(num)")
 })
 .addDisposableTo(disposeBag)
 
strikes.onNext(2)
strikes.onNext(2)
strikes.onNext(3)
strikes.onNext(4)
strikes.onNext(5)
 
strikes.onCompleted()

/* 打印結(jié)果
3
4
5
*/

到目前為止,上面的過濾操作都是基于一些靜態(tài)條件。如果現(xiàn)在你需要根據(jù)其它可觀察對象實例的行為進(jìn)行過濾判斷怎么辦呢?所以接下來將會介紹涉及多實例的動態(tài)判斷,其中最常見的就是 skipUntil 操作。該操作過程如下圖,上面兩行表示可觀察對象的生命周期而最下面的表示觀察者,直到第二行的可觀察對象發(fā)送數(shù)據(jù)后第三行的觀察者才能接受到第一行發(fā)送的數(shù)據(jù)。

圖示對應(yīng)代碼:

let strikes = PublishSubject<String>()
let trigger = PublishSubject<String>()
  
let disposeBag = DisposeBag()
 
strikes
 .skipUntil(trigger)
 .subscribe(onNext: { 
  print($0)
 })
 .addDisposableTo(disposeBag)
 
strikes.onNext("1")

trigger.onNext("X")

strikes.onNext("2")
strikes.onNext("3")
 
strikes.onCompleted()

/* 打印結(jié)果
2
3
*/

Take 過濾

這是一組與 Skip 相反的過濾操作。這組操作中最基礎(chǔ)的操作為 take ,該操作的過程完全與 skip 相反。下圖演示了 take(2) 操作的過程,它只會對前兩個事件進(jìn)行響應(yīng)而忽略后面的事件。

上圖對應(yīng)代碼:

let strikes = PublishSubject<String>()
  
let disposeBag = DisposeBag()
 
strikes
 .take(2)
 .subscribe(onNext: { 
  print($0)
 })
 .addDisposableTo(disposeBag)
 
strikes.onNext("1")
strikes.onNext("2")
strikes.onNext("3")
 
strikes.onCompleted()

/* 打印結(jié)果
1
2
*/

除此之外,skipWhile 也有對應(yīng)的 Take 操作 takeWhile ,兩者的代碼結(jié)構(gòu)幾乎一致只不過前者是跳過操作而后者則是響應(yīng)操作。不過這里我不準(zhǔn)備介紹 takeWhile 操作(可以自己動手試下),而是介紹 takeWhile 變種 takeWhileWithIndex。其實函數(shù)名已經(jīng)表明了該操作的主要功能,在 takeWhile 的基礎(chǔ)上會加上索引 index 參數(shù)。因為有時候我們除了需要通過 value 進(jìn)行過濾判斷外,索引 index 也可能是一個判斷維度。下圖就展示了 takeWhileWithIndex 簡單使用示例,對于 value 和 index 值小于 1 的事件全部跳過。

圖示對應(yīng)代碼:

let strikes = PublishSubject<Int>()
  
let disposeBag = DisposeBag()
 
strikes
 .takeWhileWithIndex { integer, index in
  integer > 1 && index > 1
 }
 .subscribe(onNext: { 
  print( "\($0)")
 })
 .addDisposableTo(disposeBag)
 
strikes.onNext(1)
strikes.onNext(2)
strikes.onNext(3)
 
strikes.onCompleted()

/* 打印結(jié)果
3
*/

其實 Skip 組中同樣存在與 takeWhileWithIndex 相對的 skipWhileWithIndex ,感興趣可以自己檢驗一下。接下來我們介紹 Take 組中的最后一個操作 takeUntil 。同樣地該操作是 skipUntil 的反操作,直到另一個實例對象觸發(fā)后該實例對象的觀察者才會停止響應(yīng)。下圖就是 takeUntil 操作的一個簡單示例,作為觀察者第三行會一直響應(yīng)第一行可觀察對象發(fā)送的數(shù)據(jù),直到第二行對象觸發(fā)后才停止。

對應(yīng)代碼:

let strikes = PublishSubject<String>()
let trigger = PublishSubject<String>()

let disposeBag = DisposeBag()
 
strikes
 .takeUntil(trigger)
 .subscribe(onNext: { 
  print($0)
 })
 .addDisposableTo(disposeBag)
 
strikes.onNext("1")
strikes.onNext("2")

trigger.onNext("X")

strikes.onNext("3")
 
strikes.onCompleted()

/* 打印結(jié)果
1
2
*/

Distinct 過濾

最后本文將介紹 Distinct 過濾操作 distinctUntilChanged 。對于觀察者來說,有時可觀察對象可能在某段時間內(nèi)連續(xù)發(fā)生相同的數(shù)據(jù)。假設(shè)這些數(shù)據(jù)與 UI 相關(guān)的話,那么這里就存在不必要的刷新操作了。所以我們有必要對過濾這些連續(xù)的相同數(shù)據(jù),減少不必要的響應(yīng)操作。下圖就是一個簡單的示例,圖中我們過濾掉了相同的后續(xù)數(shù)據(jù),只會對第一個作出響應(yīng)。

對應(yīng)示例代碼:

let strikes = PublishSubject<String>()

let disposeBag = DisposeBag()
 
strikes
 .distinctUntilChanged()
 .subscribe(onNext: { 
  print($0)
 })
 .addDisposableTo(disposeBag)
 
strikes.onNext("1")
strikes.onNext("2")
strikes.onNext("2")
strikes.onNext("3")
 
strikes.onCompleted()

/* 打印結(jié)果
1
2
3
*/

總結(jié)

本文在前面的基礎(chǔ)上通過圖示和代碼介紹了主要的過濾操作。掌握好這些操作有利于我們最大化的發(fā)揮 RxSwift 功力。當(dāng)然文中的代碼都非常簡單,所以我希望你在實際編程中不斷磨練。

好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • Swift編程中的一些類型轉(zhuǎn)換方法詳解

    Swift編程中的一些類型轉(zhuǎn)換方法詳解

    這篇文章主要介紹了Swift編程中的一些類型轉(zhuǎn)換方法詳解,是Swift入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-11-11
  • 深入講解C語言編程中volatile修飾符的作用

    深入講解C語言編程中volatile修飾符的作用

    這篇文章主要介紹了C語言編程中volatile修飾符的作用,文章深入到內(nèi)存優(yōu)化方面進(jìn)行解析,非常推薦!需要的朋友可以參考下
    2015-11-11
  • 在Swift程序中實現(xiàn)手勢識別的方法

    在Swift程序中實現(xiàn)手勢識別的方法

    這篇文章主要介紹了在Swift程序中實現(xiàn)手勢識別的方法,蘋果的Swift語言即將進(jìn)入2.0開源階段,人氣爆棚中:D 需要的朋友可以參考下
    2015-07-07
  • Swift并發(fā)系統(tǒng)并行運行多個任務(wù)使用詳解

    Swift并發(fā)系統(tǒng)并行運行多個任務(wù)使用詳解

    這篇文章主要為大家介紹了Swift并發(fā)系統(tǒng)并行運行多個任務(wù)使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • Swift中static和class關(guān)鍵字的深入講解

    Swift中static和class關(guān)鍵字的深入講解

    這篇文章主要給大家介紹了關(guān)于Swift中static和class關(guān)鍵字的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者使用Java具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Swift中的命名空間詳解

    Swift中的命名空間詳解

    這篇文章主要給大家介紹了關(guān)于Swift中命名空間的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12
  • 簡陋的swift carthage copy-frameworks 輔助腳本代碼

    簡陋的swift carthage copy-frameworks 輔助腳本代碼

    下面小編就為大家分享一篇簡陋的swift carthage copy-frameworks 輔助腳本代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • 深入理解Swift中單例模式的替換及Swift 3.0單例模式的實現(xiàn)

    深入理解Swift中單例模式的替換及Swift 3.0單例模式的實現(xiàn)

    這篇文章主要給大家介紹了關(guān)于Swift中單例模式替換的相關(guān)資料,然后又跟大家分享了關(guān)于Swift3.0 單例模式實現(xiàn)的幾種方法-Dispatch_Once的內(nèi)容,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-11-11
  • Swift類型創(chuàng)建之自定義一個類型詳解

    Swift類型創(chuàng)建之自定義一個類型詳解

    這篇文章主要介紹了Swift類型創(chuàng)建之自定義一個類型詳解,本文講解了自定義原型、實現(xiàn)默認(rèn)值、支持基本布爾型初始化、支持Bool類型判斷、支持兼容各們各派的類型、完善OCBool的布爾基因體系等內(nèi)容,需要的朋友可以參考下
    2015-05-05
  • Swift實現(xiàn)多個TableView側(cè)滑與切換效果

    Swift實現(xiàn)多個TableView側(cè)滑與切換效果

    這篇文章主要為大家詳細(xì)介紹了Swift實現(xiàn)多個TableView側(cè)滑與切換效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11

最新評論

锡林郭勒盟| 元氏县| 阿鲁科尔沁旗| 凭祥市| 成安县| 德兴市| 镇远县| 凤山市| 九龙城区| 宁安市| 长丰县| 伊春市| 徐汇区| 盐山县| 永靖县| 临夏县| 永平县| 安宁市| 即墨市| 诸暨市| 宜兰县| 彭州市| 横峰县| 彭水| 冕宁县| 大冶市| 沁源县| 麻江县| 滁州市| 达日县| 长沙市| 视频| 崇左市| 榆树市| 福泉市| 惠东县| 左权县| 汤阴县| 吴堡县| 海城市| 钟山县|