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
베이스 연주는 건강에 좋습니다