[회고] 신입 iOS 개발자가 되기까지 feat. 카카오 자세히보기

🍎 Apple/Combine & Rx

[Combine] Operator (2): Filtering Operator

inu 2022. 1. 12. 13:21
반응형

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까지 혹은 조건식을 만족할때까지만 데이터를 반환한다.
반응형