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

🍎 Apple/Combine & Rx

[Combine] Operator (4): Sequence Operator

inu 2022. 1. 12. 14:54
반응형

Sequence Operator

Combine에서 Operator는 Publisher를 가공해 다른 형태나 구성으로 변경해주는 역할을 한다. Upstream으로부터 전달받은 데이터를 가공하여 downstream으로 전달하는 것이다.

 

그 중 배열로 이루어진 Output을 변환하는 Operator(Sequence Operator)를 정리해보겠다.


min and max

Example

let publisher = [1,-45,3,45,100].publisher

publisher
.max()
    .sink {
        print($0)
}

Output

100

  • publisher가 finish될 때까지 기다리고 이 후 연산을 처리한다.
  • 데이터 중 max(min)값을 반환한다.

first and last

Example

let publisher = ["A","B","C","D"].publisher

publisher.first().sink {
    print($0)
}

publisher.first(where: { "Cat".contains($0) }).sink {
    print($0)
}

print("Last Publisher")

publisher.last().sink {
    print($0)
}

Output

A
C
Last Publisher
D

  • 첫번째(frist) 혹은 마지막(last) 데이터를 방출한다.
  • first는 조건을 만족하면 바로 방출되고, last는 finish 이후에 방출된다.

output

Example

let publisher = ["A","B","C","D"].publisher

publisher.output(at: 2).sink {
    print($0)
}

print("Output(in)")

publisher.output(in: (0...2)).sink {
    print($0)
}

Output

C
Output(in)
A
B
C

  • 특정 index의 데이터를 방출하도록 한다.
  • at을 활용해 한개를, in을 활용해 여러개를 방출할 수 있다.

count

Example

let publisher = ["A","B","C","D"].publisher

let publisher1 = PassthroughtSubject<Int, Never>()

publisher.count()
    .sink {
        print($0)
}

publisher.count()
    .sink {
        print($0)
}

publisher1.send(10)
publisher1.send(10)
publisher1.send(10)
publisher1.send(10)
publisher1.send(completion: .finished)

Output

4
4

  • publisher가 finish될 때까지 기다리고 이 후 연산을 처리한다.
  • 데이터의 개수를 방출한다.

contains

Example

let publisher = ["A","B","C","D"].publisher

publisher.contains("F").sink {
    print($0)
}

Output

false

  • 주어진 조건을 만족하는 값이 존재하는지 Bool값으로 방출한다.

allSatisfy

Example

let publisher = [12,2,14,4,6,8].publisher

publisher.allSatisfy { $0 % 2 == 0 }.sink { allEven in
    print(allEven)
}

Output

true

  • 주어진 조건을 모두 만족하는지 Bool값으로 방출한다.

reduce

Example

let publisher = [1,2,3,4,5,6].publisher

publisher.reduce(0) { accumulator, value in
    print("accumulator: \(accumulator) and the value is \(value)")
    return accumulator + value
}.sink {
    print($0)
}

Output

accumulator: 0 and the value is 1
accumulator: 1 and the value is 2
accumulator: 3 and the value is 3
accumulator: 6 and the value is 4
accumulator: 10 and the value is 5
accumulator: 15 and the value is 6
21

  • upstream의 값을 누적해서 finish되었을 때 방출한다.
  • scan과의 차이점 : scan은 값을 매번 방출하는 반면, reduce는 누적된 값을 한번에 방출한다.
반응형