현재 다니고 있는 회사에서는 UIKit + Combine을 활용한 앱을 개발하고 있다. 따라서 이제껏 Combine을 써오긴 했지만 뭐가 뭔지도 모르고 항상 쓰고 있어서 이번에는 꼭 깊게 공부를 해보려고 다짐하며 글을 쓰게 되었다.
진짜 이번에도 안하면 내가 사람이 아니지
Combine 5가지 프로토콜
1. Publisher
2. Subscriber
3. Subject
4. Scheduler
5. Cancellable
Publisher란?
Publisher는 프로토콜.
타입이 시간에 따라 일련의 값을 전송할 수 있음을 선언한다.
Publisher는 하나 이상의 Subscriber 인스턴스에게 element를 제공한다.
Publisher는 receive(subscriber:) 메소드를 구현해 subscriber를 accept한다.
Subscriber란?
Subscriber는 프로토콜.
Publisher로부터 input을 받을 수 있는 타입을 선언하는 프로토콜
Subscriber 인스턴스는 Publisher의 element stream, 그들의 relationship의 변경사항을 설명하는 life cycle 이벤트를 받는다.
-> Publisher는 값을 주는 애, Subscriber는 Publisher에게 값을 받는 애라고 생각하면 편할 듯
Publisher를 만드는 방법 총 6가지
1. class Future
2. struct Just
3. struct Deferred
4. struct Empty
5. struct Fail
6. struct Record
just 예제
just는 각 subscriber에게 output을 한번만 출력한 다음 완료하는 publisher이며,
Publisher 프로토콜을 채택한 Struct이다.
just 사용방법:
let publisher = Just("jun")
이렇게 하면 publisher가 "jun"이라는 문자열을 발행하게 된다.
그렇다면 발행된 것을 받을 수 있는 Subscriber가 필요한데, 이 때 사용하는 메서드가 sink이다.
sink란?
sink 메소드는 Subscriber를 만들고, subscriber를 리턴하기 전에 즉시 unlimited number of values를 요청한다.
일단은 subscriber를 만들어주는 메소드라 이해하고 넘어가겠다.
sink 사용방법:
let publisher = Just("jun")
// 1
let subscriber = publisher.sink { (value) in
print(value)
}
// 2
let subscriber = publisher.sink(receiveCompletion: { (result) in
switch result {
case .finished:
print("완료됨")
case .failure(let error):
print(error.localizedDescription)
}
}, receiveValue: { (value) in
print(value)
})
1번은 publisher.sink를 이용해 subscriber를 만들고, 값을 요청하므로 jun이 출력되게 된다.
2번은 receiveValue에 있는 value인 "jun"을 먼저 출력한 후 완료되었다는 의미로 "완료됨"이 출력된다.
참고:
'iOS 개발 > Combine' 카테고리의 다른 글
[Combine] Operater란? (1) (1) | 2023.05.25 |
---|---|
[Combine] Publisher Future와 CompletionHandler의 차이 (0) | 2023.05.24 |
[Combine] CurrentValueSubject & PassthroughSubject 예제(2 - 1) (0) | 2023.05.18 |
[Combine] Subject 정의 및 예제(2) (0) | 2023.05.18 |
[Combine] Combine 정의(0) (0) | 2023.03.02 |