1. Publisher

Publisher 는 값을 발행하는 발행자를 말함. 구독자는 Publisher 가 방출하는 값을 전달받을 수 있음.

import Foundation
import Combine

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

//subscriber가 구독자가 방출하는 값을 받아 그 중 짝수만을 프린트함
let subscriber = publisher
    .filter {
        $0 % 2 == 0
    }
    .sink { intValue in
        print("\(intValue)")
    }

2. Cancellable

구독을 취소할 수 있는 타입. 컴바인에서 퍼블리셔를 구독하게 되면 Cancellable(혹은 AnyCancellable) 을 반환하며 .cancel() 메서드를 이용하여 언제든 구독을 취소할 수 있음.

import Foundation
import Combine

//매 1초마다 현재 시간을 방출하는 컴바인 타이머
let timer = Timer.publish(every: 1, on: .current, in: .default).autoconnect()

//구독자가 매 초마다 타이머의 값을 프린트함
let timerSubscriber: AnyCancellable = timer.sink { time in
    print(time)
}

//5초 후 구독을 종료함
Task {
    DispatchQueue.global(qos:.default).asyncAfter(deadline: .now() + 5) {
        timerSubscriber.cancel()
        print("Subscription is cancelled.")
    }
}

3. PassthroughSubject

PassthroughSubject의 특징은 아래와 같음.

1. 초기값을 가지지 않음
2. 구독자는 구독한 이후 변경되는 값부터 받아볼 수 있음

import Foundation
import Combine

//PassthroughSubject Publisher로 첫번째 제네릭은 전달할 타입, 두번째는 에러 타입.
let publisher = PassthroughSubject<Int, Never>()

//첫번째 구독자
let subscriber1: AnyCancellable = publisher.sink { integer in
    print("integer1 is: \(integer)")
}

publisher.send(123) //구독자1이 123을 출력

//두번째 구독자
let subscriber2 = publisher.sink { integer in
    print("integer2 is: \(integer)")
}

publisher.send(456) //두 구독자 모두 456을 출력
publisher.send(789) //두 구독자 모두 789를 출력

/*
 위의 순서에 따른 프린트 결과:
 integer1 is: 123
 integer1 is: 456
 integer2 is: 456
 integer1 is: 789
 integer2 is: 789
*/

4. CurrentValueSubject

CurrentValueSubject의 특징은 아래와 같음.

1. 초기값을 가짐
2. 구독자는 구독과 동시에 즉시 값을 전달받을 수 있음
3. 새로운 값을 방출할 때마다 구독자에게 자동으로 알림

import Foundation
import Combine

//PassthroughSubject Publisher로 첫번째 제네릭은 전달할 타입, 두번째는 에러 타입.
let publisher = CurrentValueSubject<Int, Never>(100) //100은 initial value

//첫번째 구독자
let subscriber1: AnyCancellable = publisher.sink { integer in
    print("integer1 is: \(integer)") //초기값 100은 이곳에서 한번만 프린트됨
}

publisher.send(200) //갱신된 값 200을 구독자1이 프린트함

//두번째 구독자
let subscriber2 = publisher.sink { integer in
    print("integer2 is: \(integer)") //구독자 2가 새로 설정된 초기값 200을 프린트함
}

publisher.send(300) //구독자 1,2가 모두 갱신된 값 300을 프린트함

/*
 위의 순서에 따른 프린트 결과:
 integer1 is: 100
 integer1 is: 200
 integer2 is: 200
 integer1 is: 300
 integer2 is: 300
*/

이렇게 써놔야 까먹어도 또 볼수있겠지...


WRITTEN BY
artfrige
베이스 연주는 건강에 좋습니다
,