亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Swift > 正文

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

2020-03-09 17:44:16
字體:
供稿:網(wǎng)友

前言

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

Ignore 過濾

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

rxswift,rxswift是什么,教程

示例代碼:

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!*/

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

rxswift,rxswift是什么,教程

與之相應(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*/

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

rxswift,rxswift是什么,教程

圖示對(duì)應(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é)果12*/

Skip 過濾

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

rxswift,rxswift是什么,教程

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é)果345*/

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

rxswift,rxswift是什么,教程

下面是跳過偶數(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é)果345*/

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

rxswift,rxswift是什么,教程

圖示對(duì)應(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é)果23*/

Take 過濾

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

rxswift,rxswift是什么,教程

上圖對(duì)應(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é)果12*/

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

rxswift,rxswift是什么,教程

圖示對(duì)應(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*/

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

rxswift,rxswift是什么,教程rxswift,rxswift是什么,教程rxswift,rxswift是什么,教程

對(duì)應(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é)果12*/

Distinct 過濾

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

rxswift,rxswift是什么,教程

對(duì)應(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é)果123*/

總結(jié)

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

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


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到swift教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
成人影院在线看| 99久久99久久精品免费观看| 亚洲人成啪啪网站| av中文字幕一区| 日本高清成人免费播放| 亚洲二区三区四区| 精品在线视频免费| 国产精品亚洲片夜色在线| 欧美三级午夜理伦| 亚洲精品欧美综合四区| 7777精品| 精品久久久久久无码中文野结衣| 新天天拍日日拍狠狠拍| 91一区二区三区在线| 激情综合网五月激情| 男人天堂网在线视频| 亚洲午夜久久久久久久久久久| 国产精品国产精品国产专区不蜜| 美女伦理水蜜桃4| 成人免费视频视频| 黄动漫在线免费观看| palipali轻量版永久网页入口| 欧美精品v日韩精品v国产精品| 中文字幕视频三区| 97avcom| 欧美色视频在线| gratisvideos另类灌满| 日韩欧美色综合网站| 97人人模人人爽人人喊38tv| 日批视频免费在线观看| 成人网站免费观看入口| 日韩无码精品一区二区三区| 欧美精品一区二区三区久久久| 高清一区二区三区| 91成人免费在线观看| 欧美精品导航| 超级砰砰砰97免费观看最新一期| 亚洲精选av| 亚洲欧美一区二区三区| av亚洲一区| 九九热视频在线免费观看| 欧美亚洲一级二级| 成人黄色中文字幕| 国产美女在线观看一区| 在线观看视频亚洲| 亚洲色图100p| 国产在线拍揄自揄拍无码视频| 圆产精品久久久久久久久久久| aaaaa级少妇高潮大片免费看| 日韩中文字幕无砖| 日本高清久久一区二区三区| 2021国产视频| 欧美亚洲视频| 日韩欧美在线免费观看视频| 黄色aaa级片| 精品国产_亚洲人成在线| 老司机精品影院| 色噜噜日韩精品欧美一区二区| 精品综合久久久久久8888| 99视频一区二区| 亚洲精品第一国产综合野| 三级视频在线看| 最近中文字幕免费观看| 久久综合网络一区二区| 中文字幕久热精品视频免费| 欧美人妻精品一区二区免费看| 成人在线观看视频网站| 精品一区视频| 日韩三级在线观看| 欧美91在线|欧美| 日本在线观看一区二区| 精品少妇一区二区三区在线播放| 久久精品一区二区免费播放| www.在线欧美| 国产伊人网av.| 国产精品久久久久久久免费软件| 国产欧美日韩精品高清二区综合区| 日韩视频中午一区| av网站导航在线观看免费| 亚洲激情视频在线观看| 国产精品无码一区二区在线| 精品一区二区三区视频在线观看| 手机在线视频一区| 91精品久久久久久久久99蜜臂| 国产一区不卡在线观看| 亚洲男男gay视频| 四虎永久在线精品免费一区二区| 国产精品久久久久7777按摩| 成人免费无码大片a毛片| 正在播放91九色| 狂野欧美激情性xxxx| 久久国产夜色精品鲁鲁99| 毛片视频免费| 免费中文字幕| 日韩av一级片| 韩国三级电影久久久久久| 高清av免费看| 岛国视频免费在线观看| 蜜桃国内精品久久久久软件9| 欧洲成人综合网| 亚洲一区精品视频| 亚洲深夜福利在线| 精品国产成人在线影院| 欧美最大成人综合网| 国产一二精品视频| 亚洲va欧美va在线观看| 午夜免费久久久久| 在线观看亚洲精品福利片| 欧美精品偷拍| 亚洲激情五月| 日韩高清不卡| 亚洲一区二区三区久久久| 亚洲激情电影中文字幕| 亚洲乱码国产乱码精品天美传媒| av一区二区三区在线| 亚洲精品aⅴ中文字幕乱码| 在线观看免费看片| 国产精品拍拍拍| 国产片在线观看| 波多野结衣91| 久久国产精品久久精品国产| 秋霞在线观看一区二区三区| 中文字幕日韩综合| 国产精品99久久久久久人| 成人小视频免费看| 亚洲天堂av一区二区| 欧美日韩国产在线观看网站| 精品捆绑调教一区二区三区| 欧美午夜小视频| 国产 欧美在线| 欧美国产日韩综合| 国产一级二级三级在线观看| japanese国产在线观看| 国产精品黄色| 精品一区二区三区日韩| 天天射天天干天天| 夜夜爽www精品| 视频一区二区三区在线观看| av毛片久久久久**hd| 中文字幕欧美日韩精品| 欧美va在线播放| 欧美午夜片在线观看| 亚洲精品一区二区三区婷婷月| 天堂网www在线中文天堂| 在线一级视频| 欧美1级2级| 涩涩视频网站在线观看| 亚洲女人天堂成人av在线| 欧美麻豆久久久久久中文| 亚洲精品久久久久久动漫器材一区| www.国产黄色| 九九热视频在线免费观看| 激情综合视频| 日本三级中国三级99人妇网站| 中文字幕亚洲在线| 男女啪啪无遮挡网站| 午夜在线激情影院| 亚洲男女一区二区三区| 777精品久无码人妻蜜桃| 91精品久久久久久久久久另类| yiren22综合网成人| 秘密基地免费观看完整版中文| 日韩电影在线观看完整免费观看| 亚洲一区二三| 久久一夜天堂av一区二区三区| bt天堂新版中文在线地址| 国产视频在线一区| 91在线中文字幕| 91av在线国产| 天堂中文在线免费观看| 亚洲精品福利电影| 成人久久综合| 欧美国产在线电影| 久久久久久久999精品视频| 国产精品一国产精品| 在线一区二区不卡| 精品香蕉在线观看视频一| 韩国v欧美v日本v亚洲| 18av网站| 区日韩二区欧美三区| 中文字幕色av一区二区三区| 99热在线播放| 国模套图日韩精品一区二区| 91精品国产一区二区三区蜜臀| 国产一区二区三区免费观看在线| 亚洲成人动漫在线| 成人性生活视频| www.午夜色| 强行糟蹋人妻hd中文| 成人午夜在线观看| 日韩国产伦理| 国产精品丝袜91| 亚洲黄色小说在线观看| 高清精品一区二区三区一区| 宅男噜噜噜66国产精品免费| 成人久久18免费网站漫画| 中文字幕有码在线观看| theporn国产在线精品| 少妇太紧太爽又黄又硬又爽小说| 国产精品久久久久久亚洲伦| 欧美日韩免费网站| 亚洲精品人妻无码| 成人做爰www看视频软件| 午夜成人在线视频| av中文字幕观看| 成人国产一区| 高潮毛片在线观看| 国产成人免费av电影| 欧美aaa大片视频一二区| 国产老熟妇精品观看| 国产一级片麻豆| 国产一二三视频| 国产精品99久久免费黑人人妻| 风间由美中文字幕在线看视频国产欧美| av成人 com a| 99影视tv| xvideos.蜜桃一区二区| 夜夜嗨av一区二区三区中文字幕| 成人av免费在线播放| 成人免费看的视频| 国产伦精品一区二区三区四区视频_| 伊人久久大香线蕉av一区| 中国美女黄色一级片| 91精品国产免费久久综合| 波多野结衣一区二区在线| 91在线观看高清| 成人免费一级片| 91日本视频在线| 欧美性猛交xxxx免费看手交| 日产午夜精品一线二线三线| 成看片vvv222| 美女久久网站| 亚洲欧美强伦一区二区| 国产成人在线播放视频| 亚洲国产精品久久久久婷婷老年| 亚洲精品推荐| 激情五月色婷婷| 羞羞小视频视频| 视频一区二区中文字幕| 超碰精品在线| 尤物视频网站在线观看| 美女av一区二区| 人妻熟女aⅴ一区二区三区汇编| 在线观看色视频| 希岛爱理一区二区三区av高清| 免费在线观看麻豆视频| 日韩欧美亚洲天堂| 日本ー区在线视频| 国产视频在线一区| 热久久美女精品天天吊色| 日本最新高清不卡中文字幕| 美女视频黄免费的亚洲男人天堂| 国产精品水嫩水嫩| 国产女人水真多18毛片18精品视频| 亚洲激情自拍视频| 黑丝美女一区二区| 亚洲色偷偷色噜噜狠狠99网| 午夜av噜噜噜噜噜噜| 国产精品123区| 午夜影院在线观看欧美| 热re66久久精品国产99re| 色偷偷色偷偷色偷偷在线视频| 国产又黄又爽视频| 欧美日本韩国一区| 免费黄网站在线观看| 97影院手机在线观看| 亚洲午夜私人影院| 欧美精品黑人性xxxx| 亚洲国产成人精品女人久久| 九九久久电影| 欧美黄色免费影院| 国产精品九九九九| 久久精品人妻一区二区三区| 波多野结衣中文字幕一区二区三区| 亚洲欧美日韩综合国产aⅴ| 黄瓜视频污在线观看| 粉嫩高潮美女一区二区三区| 久久久精品国产| www.中文字幕av| 人妻内射一区二区在线视频| 最新中文字幕在线观看| 欧洲亚洲妇女av| 青青青国内视频在线观看软件| 91久久人澡人人添人人爽欧美| 欧美午夜免费影院| 伊人精品影院| 国产手机在线观看| 国产亚洲免费的视频看| 精品蜜桃传媒| 国产精品亚洲欧美一级在线| 国产精品免费观看高清| 欧美一区激情视频在线观看| 欧美精品激情| 精品卡一卡卡2卡3网站| 高h调教冰块play男男双性文| 亚洲天堂自拍偷拍| 97最新国自产拍视频在线完整在线看| 欧美日韩一区二区三区视视频| 日本激情在线观看| 污的视频网站| 深夜福利一区二区| 精品人妻在线播放| yy4480电影网| 五月激情综合| 亚洲伊人伊成久久人综合网| 色先锋资源久久综合5566| 97精品欧美一区二区三区| 99久久人爽人人添人人澡| 日韩欧美国产成人一区二区| 亚洲精品毛片一区二区三区| 51vv免费精品视频一区二区| 99精品免费观看| 亚洲人精品午夜在线观看| 国产在线不卡一卡二卡三卡四卡| 亚洲激情一区二区三区| 在线日韩日本国产亚洲| 9l亚洲国产成人精品一区二三| 日韩精品中文字幕有码专区| 亚洲制服欧美久久| 一区二区三区在线影院| 北条麻妃在线观看视频| f2c人成在线观看免费视频| 蜜桃av免费观看| 大奶在线精品| 91麻豆精品91久久久久久清纯| 蜜臀国产一区| 91探花福利精品国产自产在线| 国产成人精品一区二区免费看京|