欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

前言

在前面的基礎(chǔ)之上接下來我會介紹一些常用的函數(shù)和實用技巧。首先,本文將會介紹那些用于對 next 事件進行過濾的操作。這些過濾操作類似于 Swift 標(biāo)準(zhǔn)庫中的 filter 操作。它能在我們開始真正進行業(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 進行過濾。下圖演示了只響應(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ù)其它可觀察對象實例的行為進行過濾判斷怎么辦呢?所以接下來將會介紹涉及多實例的動態(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) 操作的過程,它只會對前兩個事件進行響應(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 進行過濾判斷外,索引 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指針及內(nèi)存管理內(nèi)存綁定實例詳解

    swift指針及內(nèi)存管理內(nèi)存綁定實例詳解

    這篇文章主要為大家介紹了swift指針及內(nèi)存管理內(nèi)存綁定實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • Swift中的可選項Optional解包方式實現(xiàn)原理

    Swift中的可選項Optional解包方式實現(xiàn)原理

    這篇文章主要為大家介紹了Swift中的可選項Optional解包方式實現(xiàn)原理示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • Swift 3中使用FMDB遇到的問題與解決方法

    Swift 3中使用FMDB遇到的問題與解決方法

    相信大家都熟悉OC使用FMDB第三方庫,進行數(shù)據(jù)庫操作,增、刪、改、查,但最近在Swift 3中使用FMDB遇到了一些問題,下面這篇文章主要給大家介紹了關(guān)于在Swift 3中使用FMDB遇到的問題與解決方法,需要的朋友可以參考下。
    2017-07-07
  • Swift面試題及答案整理

    Swift面試題及答案整理

    雖然Swift出現(xiàn)的時間不久,但是它已經(jīng)成為最流行的編程語言之一了。Swift的知識浩如煙海,但是怎么測試你掌握了多少?通過下面這篇整理關(guān)于Swift面試題及答案,可能會對你所掌握的Swift進行一個判斷,需要的朋友可以參考借鑒。
    2017-01-01
  • Swift教程之閉包詳解

    Swift教程之閉包詳解

    這篇文章主要介紹了Swift教程之閉包詳解,閉包可以在上下文的范圍內(nèi)捕獲、存儲任何被定義的常量和變量引用,因這些常量和變量的封閉性,而命名為“閉包(Closures)”,需要的朋友可以參考下
    2015-01-01
  • Swift中通知中心(NotificationCenter)的使用示例

    Swift中通知中心(NotificationCenter)的使用示例

    這篇文章主要給大家介紹了關(guān)于Swift中通知中心(NotificationCenter)使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-10-10
  • Swift心得筆記之運算符

    Swift心得筆記之運算符

    區(qū)別于 C 語言,在 Swift 中你可以對浮點數(shù)進行取余運算(%),Swift 還提供了 C 語言沒有的表達兩數(shù)之間的值的區(qū)間運算符,(a..b和a...b),這方便我們表達一個區(qū)間內(nèi)的數(shù)值。
    2015-04-04
  • Swift類型創(chuàng)建之自定義一個類型詳解

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

    這篇文章主要介紹了Swift類型創(chuàng)建之自定義一個類型詳解,本文講解了自定義原型、實現(xiàn)默認(rèn)值、支持基本布爾型初始化、支持Bool類型判斷、支持兼容各們各派的類型、完善OCBool的布爾基因體系等內(nèi)容,需要的朋友可以參考下
    2015-05-05
  • iOS Swift讀取本地json文件報錯的解決方法

    iOS Swift讀取本地json文件報錯的解決方法

    只要是app開發(fā)者都知道,從服務(wù)器端獲得的數(shù)據(jù)要不就是json格式的數(shù)據(jù),要么就是xml格式的數(shù)據(jù),而這篇文章主要給大家介紹了關(guān)于iOS Swift讀取本地json文件報錯的解決方法,需要的朋友可以參考借鑒,下面來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-11-11
  • 深入講解Swift的內(nèi)存管理

    深入講解Swift的內(nèi)存管理

    不管在什么語言里,內(nèi)存管理的內(nèi)容都很重要,Swift使用自動引用計數(shù)來管理應(yīng)用程序的內(nèi)存使用。這表示內(nèi)存管理已經(jīng)是Swift的一部分,在大多數(shù)情況下,你并不需要考慮內(nèi)存的管理。本文主要介紹了Swift中內(nèi)存管理的相關(guān)資料,需要的朋友可以參考。
    2017-03-03

最新評論