์ค๋์ Apple ์์ ๋ง๋ Reactive ํ๋ก๊ทธ๋๋ฐ์ ์ํ ํ๋ ์ ์ํฌ "Combine"์ ๋ํด ์ ๋ฆฌ ํด๋ณด๋ ค๊ณ ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณค WWDC2021์์ ์๋ก ๋์จ Concurrency์ ๋ํด์๋ ์์๋ณผ ์์ ์ ๋๋ค.
โก๏ธ ์ค๋์ ๋ชฉํ : Combine, Publisher, Subscriber, Publisher ↔๏ธ Subscriber
์ ์ :
์ด๋ฒคํธ ์ฒ๋ฆฌ ์ฐ์ฐ์๋ค์ ํตํด ๋น๋๊ธฐ ์ด๋ฒคํธ๋ค์ ํธ๋ค๋ง ํ ์ ์๊ฒ ํ๋ ํ๋ ์์ํฌ
Combine ํ๋ ์์ํฌ๋ ์๊ฐ์ด ํ๋ฆ์ ๋ฐ๋ฅธ ๊ฐ ์ฒ๋ฆฌ๋ฅผ ์ํ ์ ์ธ์ Swift API๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด๋ฌํ ๊ฐ์ ๋ค์ํ ์ข ๋ฅ์ ๋น๋๊ธฐ ์ด๋ฒคํธ๋ฅผ ๋ํ๋ผ ์ ์์ต๋๋ค. Combine์ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ๋ณ๊ฒฝ๋ ์ ์๋ ๊ฐ์ ๋ ธ์ถํ๋ Publisher์ Publisher๋ก๋ถํฐ ํด๋น ๊ฐ์ ์์ ํ๋ Subscriber๋ฅผ ์ ์ธํฉ๋๋ค.
Combine์ ์๊ฐ์ ๋ฐ๋ฅธ ๊ฐ ํ๋ฆ์ Publisher์ Subscriber๋ฅผ ํตํด ๋ํ๋ธ๋ค๊ณ ํ๋๋ฐ ์ด ๋๊ฐ์ง์ ๋ํด ์์ธํ ์ดํด๋ด ์๋ค
์๊ฐ์ ๋ฐ๋ฅธ ๊ฐ์ ํ๋ฆ์ ์ ๋ฌํ ์ ์๋๋ก ํ๋ ํ๋กํ ์ฝ
Output๊ณผ Failure ํ์ ์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
ํ์ ์ด ์๊ฐ์ด ํ๋ฆ์ ๋ฐ๋ผ ์ผ๋ จ์ ๊ฐ์ ์ ์ก(transmit) ํ ์ ์์์ ์ ์ธํฉ๋๋ค.
Publisher๋ ํ๋ ์ด์์ Subscriber ์ธ์คํด์ค์๊ฒ element๋ฅผ ์ ๊ณตํฉ๋๋ค.
Publisher๋ receive(subscriber:) ๋ฉ์๋๋ก subscriber๋ฅผ accept ํฉ๋๋ค.
publisher๋ก๋ถํฐ element์ stream์ ๋ฐ๋ ๊ฐ์ฒด
publihser๋ฅผ subscriber์ ์ฐ๊ฒฐํ๋ ๋ฐฉ๋ฒ
subscriber๋ ๊ฐ์ ์์ ๋ฐ์ ๋ ๋์๋ฉ๋๋ค.
publisher๋ subscriber๊ฐ ๊ฐ์ ์์ฒญํ ๊ฒฝ์ฐ์๋ง ๊ฐ์ ๋ด๋ณด๋ ๋๋ค.
์ฆ publisher๋ ์ด๋ฒคํธ๋ค์ ๋ง๋ค์ด๋ด๋(publish) ์ฃผ์ฒด๊ณ ๋ง๋ค์ด๋ธ ์ด๋ฒคํธ๋ฅผ ์ฐ๊ธฐ ์ํด subscriber๋ฅผ ์ฌ์ฉํฉ๋๋ค.
RxSwift์์ closure์ ๋ฐฉ์์ return ๊ฐ์ผ๋ก ๊ฐ์ ๋ฐํํ๋ ๊ฒ์ ๋น๋๊ธฐ์ ์ผ๋ก ๊ฐ์ ๋ฐํํด ๊ฐ์ง๊ณ ์๋ Observable๊ณผ Publisher์ ๊ฐ๋ ์ด ์ ์ฌํ๊ฑฐ ๊ฐ์ต๋๋ค. ๋ฐ๋๋ก ๊ฐ์ ์ฌ์ฉํ๊ธฐ ์ํด subscribeํ๋๋ฐ ์ด๋ ๊ฐ์ ์ ์ฅํ๋ ์ฃผ์ฒด๊ฐ Subscriber๋ผ ์๊ฐํ๋ฉด ๋ ๊ฑฐ ๊ฐ์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด publisher์ subscriber๋ฅผ ์ฐ๊ฒฐํ ๋ฐฉ๋ฒ์ด ์์ด์ผ๊ฒ ์ฃ ?
๋ค์๊ณผ ๊ฐ์ด 3๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
- subscribe
- sink
- assign - (sink์๋ ๋ค๋ฅด๊ฒ publisher์ Failure ํ์ ์ด Never์ผ๋๋ง ์ฌ์ฉ ๊ฐ๋ฅ)
//publisher ์์ฑ
let publisherJust = Just("uri")
//subscribe ๋ฐฉ์
publisherJust.subscribe(UriSubscriber())
//sink ๋ฐฉ์
let subscriber = publisherJust.sink(receiveCompletion: { (result) in switch result {
case .finished:
print("finished")
case .failure(let error):
print(error.localizedDescription)
}
}, receiveValue: { (value) in
print(value)
})
์ ์ฝ๋์ Just()๋ Publisher์ ํ ์ข ๋ฅ์ ๋๋ค. Just ์ธ์๋
๋ค์ํ publisher๋ค์ด ์์ต๋๋ค.
๋ค์ํ publisher๋ค -> https://developer.apple.com/documentation/combine
1. Subscribe ๋ฉ์๋ ์ฌ์ฉํ๊ธฐ
publisherJust.subscribe(UriSubscriber())
publisher๊ฐ UriSubscriber()๋ฅผ ๊ตฌ๋ ํ๊ณ ์๋๋ฐ์
์ฐ์ Publisher์ Subscriber๊ฐ ์๋ก ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ๋๋ ํญ์ ๋ ๊ฐ์ง์ ํ์ ์ด ์กด์ฌํฉ๋๋ค. ๋จผ์ Publisher ์ ์ฅ์์๋ Output ํ์ ๊ณผ Failure ํ์ ์ด ์กด์ฌํฉ๋๋ค. ์๋ฌ๊ฐ ๋ฐ์ํ์ ๊ฒฝ์ฐ Failure ํ์ ๊ทธ๋ ์ง ์๋ค๋ฉด Output ํ์ ์ ์ ๋ฌํฉ๋๋ค. ์ด ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ Subscriber๋ Publisher์ outputํ์ ๊ณผ ๋์ผํ Input ํ์ ๊ณผ, ๊ทธ๋ฆฌ๊ณ ๋์ผํ Failure ํ์ ์ ๊ฐ์ ธ์ผ ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ recieveํจ์๊ฐ 3๊ฐ์ง๊ฐ ์์ต๋๋ค.
์ฒ์ publisher๊ฐ publisherJust.subscribe(UriSubscriber())๋ฅผ ํธ์ถํ์๋ ๊ตฌ๋ ์ ์ฑ๊ณตํ์์ ์๋ฆฌ๋ ๋ฉ์๋๊ฐํธ์ถ๋ฉ๋๋ค.
func receive(subscription: Subscription) {}
์ด๋ subscriber์๊ฒ subscription ๊ฐ์ฒด๊ฐ ์์ฑ๋๋๋ฐ publisher๊ฐ ๊ฐ์ง ๊ฐ์ ์์ฒญํ๋ ๊ฐ์ฒด์ ๋๋ค.
subscription.request(.unlimited)
.unlimited๋ก ๋ฌดํํ ๊ฐ์ ์์ฒญํฉ๋๋ค.
๋ค๋ฅธ ์์ฒญ ๊ฐ์ผ๋ก๋ ์๋์ ๊ฐ์ต๋๋ค.
- unlimited(๋ฌด์ ํ)
- max(์ต๋ ๊ฐ์ ์ ํ)
- none(no elements. max(0)๊ณผ ๊ฐ์)
๋๋ฒ์งธ recieve()์ ๋๋ค.
๊ตฌ๋ ์ดํ publisher๊ฐ ์๋กญ๊ฒ ๋ฐํํ element๊ฐ ์๋ค๋ฉด ๋ฐ์๋ค์ ๋๋ค.
์ผ๋ง๋ ๋ง์ ๊ฐ์ ๋ฐํ ๋ฐ์์ง๋ฅผ ๋ํ๋ด๋๋ฐ์.
๋ค๋ฅธ ์์ฒญ ๊ฐ์ผ๋ก๋ ์๋์ ๊ฐ์ต๋๋ค.
- unlimited(publisher๊ฐ ์์ฑํ ์ ์๋ ๋งํผ ๋ฌด์ ํ ์์ฒญ)
- max(์ต๋ ๊ฐ์ ์ ํ)
- none(no elements. max(0)๊ณผ ๊ฐ์, ๋์ด์ ์์ฒญํ์ง x)
๋ง์ง๋ง recieve() ์ ๋๋ค.
func receive(completion: Subscribers.Completion<Never>) { //3. publisher์๊ฒ publisher๊ฐ ์ ์์ ์ผ๋ก ๋๋ ์ค๋ฅ๋ก publish๋ฅผ ์๋ฃํ์์ ์๋ฆผ
print("receive(completion: Subscribers.Completion<Never>)")
}
publisher๊ฐ ๋์ด์ ๊ฐ์ ์์ฑํ์ง ์๊ฑฐ๋ error ๋ฐ์์ ์๋ฃ์ ์๋ฏธ๋ก ์ด ํจ์๊ฐ ์คํ๋ฉ๋๋ค.
subscriber๋ฅผ ์ง์ ๋ง๋ค๊ณ subscribe() ํ๋ ๋ฐฉ์์ ํ์์ ๋ฐ๋ผ ๋ชจ๋ ํจ์๊ฐ ๋ถ๋ฆด ํ์๊ฐ ์์๊ฑฐ ๊ฐ์ต๋๋ค.
์ด๋ณด๋ค ๋์ฑ ๊ฐ๋จํ ๋ฐฉ์์ผ๋ก subscriber๋ฅผ ๋ง๋๋ ๋ฐฉ์์ด ์์ต๋๋ค.
2. sink() ๋ฉ์๋
๋ ๋ค๋ฅธ ์์์ ๋๋ค.
ํด๋ก์ ํ์์ผ๋ก subscriber๋ฅผ ๋ง๋ค๊ณ subscriber์๊ฒ ๋ฆฌํด๋๊ธฐ ์ ์ ๊ฐ์ ์ฆ์์ ์ผ๋ก ์์ฒญํ ์ ์์ต๋๋ค.
3. assign() ๋ฉ์๋
์๋ก์ด ๊ฐ์ keyPath์ ๋ฐ๋ผ ์ฃผ์ด์ง ์ธ์คํด์ค์ property์ ํ ๋นํฉ๋๋ค.
publisher์์ ๋ฐํํ ๊ฐ์ subscriber์๊ฒ ๋ฆฌํด๋๊ธฐ ์ ์ ๊ฐ์ ๋ค๋ฅธ property์ ํ ๋นํ ์ ์์ต๋๋ค.
์ด ํ๋ฆ์ ๋ค์ ์ดํด๋ณด๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
'IOS๐ > Combine' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Combine] Cancellable์ด๋ (0) | 2023.04.17 |
---|---|
[Combine] Scheduler๋ (0) | 2023.04.16 |
[Combine] ConnectablePublisher (0) | 2022.05.03 |
[Combine] Subject๋ (AnyPublisher) (0) | 2022.04.17 |
๋๊ธ