原文:7 USEFUL FILTERING OPERATORS IN RXSWIFT
运用 RxSwift 几个月后,我能够有把握地说过滤是一个关键功能,它为我节省了大量代码。要知道何时运用哪些过滤运算符,需求有一个基本的概述,所以让咱们看看这个库供给的 7 个我最喜欢的过滤运算符。
RxSwift 是盛行的 ReactiveX 库的 Swift 实现。当涉及到过滤数据时,这个库能够很好地帮助你。它有各种运算符,答应你以各种方式过滤数据,以便你只传递你期望订阅者接纳的数据。
本质上,这些运算符是对 next 事情的条件束缚。这意味着可调查目标发出的一切 next 事情元素都会经过你指定的运算符。每个元素都需求满意操作符的要求 – 假如不满意,它们将被丢掉。
大多数运算符对可调查序列进行操作并返回一个可调查序列。这样,咱们就能够链接这些运算符,由于下一个运算符将前一个运算符的输出作为输入。
需求留意的一点是:你无法运用这些运算符过滤中止事情(stop-events),即完成事情(completed-events)和错误事情(error-events)。过滤运算符仅对 next 事情进行操作。
1. filter()
列表中的第一个运算符是 filter
运算符。
该运算符的工作方式是过滤运算符将谓词作为参数。谓词作为条件束缚,可调查目标发出的每个元素都必须满意该条件束缚。这样,谓词将应用于一切元素,并确定每个元素是否答应经过订阅者。
看看这个弹珠图:
在这种情况下,filter()
将只答应值大于 10 的元素经过。这些元素将到达下一个运算符,而其余元素将被删去。
现在,让咱们看一个代码示例:
import RxSwift
let bestSellingAlbums = [
(title: "Thriller", salesInMillions: 93),
(title: "Eagles: Their Greatest Hits 1971-1975", salesInMillions: 41),
(title: "Hotel California", salesInMillions: 32),
(title: "Come on Over", salesInMillions: 29),
(title: "Led Zeppelin IV", salesInMillions: 29),
(title: "The Bodyguard Soundtrack", salesInMillions: 28),
(title: "Rumours", salesInMillions: 27),
(title: "Back in Black", salesInMillions: 26),
(title: "21", salesInMillions: 25),
(title: "Jagged Little Pill Year: 1995", salesInMillions: 24),
]
let disposeBag = DisposeBag()
// 过滤专辑销量大于等于 30 的专辑
Observable.from(bestSellingAlbums)
.filter { album in
album.salesInMillions >= 30
}
.subscribe(onNext: {
print($0)
})
.disposed(by: disposeBag)
// Output:
// (title: "Thriller", salesInMillions: 93)
// (title: "Eagles: Their Greatest Hits 1971-1975", salesInMillions: 41)
// (title: "Hotel California", salesInMillions: 32)
2. skip() & skipWhile()
顾名思义,这两个运算符的意图是在某个时间越过数据。
运用 skip
运算符,你能够将数字作为参数传递给它。这个数字告知咱们要疏忽多少元素。随后的一切元素都被答应传递给订阅者。因此,skip(2)
将疏忽前两个元素并经过后续的一切其他元素。
运用 skipWhile
运算符,你能够传递一个谓词,只需计算结果为 true
,就会疏忽传入的元素。当它的值为 false
时,后边的一切元素都将被答应经过。
让咱们用代码来看一下:
import RxSwift
let bestSellingAlbums = [
(title: "Thriller", salesInMillions: 93),
(title: "Eagles: Their Greatest Hits 1971-1975", salesInMillions: 41),
(title: "Hotel California", salesInMillions: 32),
(title: "Come on Over", salesInMillions: 29),
(title: "Led Zeppelin IV", salesInMillions: 29),
(title: "The Bodyguard Soundtrack", salesInMillions: 28),
(title: "Rumours", salesInMillions: 27),
(title: "Back in Black", salesInMillions: 26),
(title: "21", salesInMillions: 25),
(title: "Jagged Little Pill Year: 1995", salesInMillions: 24),
]
let disposeBag = DisposeBag()
// 越过专辑销量大于等于 30 的专辑
Observable.from(bestSellingAlbums)
.skipWhile { album in
album.salesInMillions > 30
}
.subscribe(onNext: {
print($0)
})
.disposed(by: disposeBag)
// Output:
// (title: "Come on Over", salesInMillions: 29)
// (title: "Led Zeppelin IV", salesInMillions: 29)
// (title: "The Bodyguard Soundtrack", salesInMillions: 28)
// (title: "Rumours", salesInMillions: 27)
// (title: "Back in Black", salesInMillions: 26)
// (title: "21", salesInMillions: 25)
// (title: "Jagged Little Pill Year: 1995", salesInMillions: 24)
3. take() & takeWhile()
接下来,咱们有各种获取运算符。这些与越过运算符相反。越过运算符将依据条件排除某些数据,但获取运算符将依照你指定的方式包含数据。
take
运算符与 skip
运算符相反。它依照你的预期工作。运用 take
运算符,你能够指定答应经过的一定数量的元素。该数字之后的一切元素都将被疏忽。
你猜对了,takeWhile
运算符与 skipWhile
运算符相反。运用 takeWhile
运算符,您能够传递一个谓词,只需计算结果为 true
,就答应传入元素。当它的计算结果为 false
时,后边的一切元素都将被疏忽。
4. elementAt()
这是一个你不能忽视的漂亮的小运算符。 elementAt
运算符将过滤掉除您在某个索引处指定的元素之外的一切后续事情。
在代码中,它将如下所示:
import RxSwift
let bestSellingAlbums = [
(title: "Thriller", salesInMillions: 93),
(title: "Eagles: Their Greatest Hits 1971-1975", salesInMillions: 41),
(title: "Hotel California", salesInMillions: 32),
(title: "Come on Over", salesInMillions: 29),
(title: "Led Zeppelin IV", salesInMillions: 29),
(title: "The Bodyguard Soundtrack", salesInMillions: 28),
(title: "Rumours", salesInMillions: 27),
(title: "Back in Black", salesInMillions: 26),
(title: "21", salesInMillions: 25),
(title: "Jagged Little Pill Year: 1995", salesInMillions: 24),
]
let disposeBag = DisposeBag()
Observable.from(bestSellingAlbums)
.elementAt(5) // 只获取第6个元素
.subscribe(onNext: {
print($0)
})
.disposed(by: disposeBag)
// Output:
// (title: "The Bodyguard Soundtrack", salesInMillions: 28),
5. ignoreElements()
最后但同样重要的是,咱们有 ignoreElements
操作符。
正如你从这个弹珠图中看到的,ignoreElements()
将简略地疏忽一切 next 事情元素。这样,你能够疏忽 next 事情,仅订阅中止事情并相应地履行操作。
总结
咱们研究了 RxSwift 供给的最常见的过滤运算符。你能够在[此处](谢谢阅读。留下封面让我知道您期望我介绍的其他 RxSwift 相关主题。)找到可用操作符的完好列表。
谢谢阅读。留言让我知道你期望我介绍的其他 RxSwift 相关主题。