반응형
Filtering Operator
Combine에서 Operator는 Publisher를 가공해 다른 형태나 구성으로 변경해주는 역할을 한다. Upstream으로부터 전달받은 데이터를 가공하여 downstream으로 전달하는 것이다.
그 중 데이터를 필터링해주는 Operator(Filtering Operator)를 정리해보자.
filter
Example
let numbers = (1...20).publisher
numbers.filter { $0 % 2 == 0 }
.sink {
print($0)
}
Output
2
4
6
8
10
12
14
16
18
20
- 조건에 통과하는 데이터들만 반환한다.
removeDuplicates
Example
let words = "apple apple apple fruit fruit apple apple mango watermelon apple".components(separatedBy: " ").publisher
words
.removeDuplicates()
.sink {
print($0)
}
Output
apple
fruit
apple
mango
watermelon
apple
- 중복을 제거한다.
- 단, 최근 버퍼를 활용한 중복확인이기 때문에 근접해있는 중복만 제거됨.
compactMap
Example
let strings = ["a","1.24","b","3.45","6.7"].publisher
.compactMap{ Float($0) }
.sink {
print($0)
}
Output
1.24
3.45
6.7
- nil값을 자동으로 제거하는 map
ignoreOutput
Example
let numbers = (1...5000).publisher
numbers.ignoreOutput().sink(receiveCompletion: { print($0) }, receiveValue: { print($0) })
Output
finished
- 결과 데이터값을 무시하도록 하고 completion만을 받도록 한다.
first
Example
let numbers = (1...9).publisher
numbers.first(where: { $0 % 2 == 0 })
.sink {
print($0)
}
Output
2
- 조건식에 맞는 첫번째 데이터만을 반환한다.
- 하나를 발견하면 바로 completion된다.
last
Example
let numbers = (1...9).publisher
numbers.last(where: { $0 % 2 == 0 })
.sink {
print($0)
}
Output
8
- 조건식에 맞는 마지막 데이터만을 반환한다.
- 마지막 데이터이기 때문에 모든 value를 검사한다.
dropFirst
Example
let numbers = (1...10).publisher
numbers.dropFirst(8)
.sink {
print($0)
}
Output
9
10
- 파라미터로 들어간 Index의 데이터부터 반환한다.
drop while
Example
let numbers = (1...10).publisher
numbers.drop(while: { $0 % 3 != 0 })
.sink {
print($0)
}
Output
3
4
5
6
7
8
9
10
- 최초로 조건식에 맞는 Index의 데이터부터 반환한다.
drop untilOutputFrom
Example
let isReady = PassthroughSubject<Void, Never>()
let taps = PassthroughSubject<Int, Never>()
taps.drop(untilOutputFrom: isReady).sink {
print($0)
}
(1...10).forEach { n in
taps.send(n)
if n == 3 {
isReady.send()
}
}
Output
4
5
6
7
8
9
10
- 주어진 파라미터의 Output이 존재할때부터 데이터를 반환한다.
prefix
Example
let numbers = (1...10).publisher
numbers.prefix(2).sink {
print($0)
}
numbers.prefix(while: { $0 < 3 }).sink {
print($0)
}
Output
1
2
1
2
- 주어진 index까지 혹은 조건식을 만족할때까지만 데이터를 반환한다.
반응형
'🍎 Apple > Combine & Rx' 카테고리의 다른 글
[Combine] timer (by Runloop, Timer Class, DispatchQueue) (2) | 2022.01.13 |
---|---|
[Combine] Operator (4): Sequence Operator (0) | 2022.01.12 |
[Combine] Operator (3): Combining Operator (0) | 2022.01.12 |
[Combine] Operator (1): Transforming Operator (0) | 2022.01.10 |
[RxSwift] Reactive Programming & RxSwift (0) | 2022.01.02 |