Scheduler๋ ์ธ์ (์๊ฐ), ์ด๋ป๊ฒ(์ค๋ ๋) Publisher์ ์์ ๋ค์ด ์ํ๋ ์ง๋ฅผ ๊ฒฐ์ ํ๊ธฐ ์ํ ๊ฐ์ฒด์ด๋ค. ๋น๋๊ธฐ ์ฒ๋ฆฌ์ ์์ด์ ์๊ฐ๊ณผ ์ค๋ ๋ ์ ํ ๋ฑ์ ์ต์ ์ ํ์์ ์ผ๋ก ๋ค์ด๊ฐ์ผ ํ๋๋ฐ, ์๊ฐ ํน์ ์ค๋ ๋ ๊ด๋ จ Operator๋ ์ด Scheduler๋ฅผ ์ธ์๋ก ์๊ตฌํ๊ธฐ ๋๋ฌธ์ ๋ฐ๋์ ์์์ผ ํ๋ ๊ฐ์ฒด์ด๊ธฐ๋ ํ๋ค.
Scheduler๋ฅผ ์ง์ ๊ตฌํํ๋ ๊ฒ์ ๋ณต์กํ๊ธฐ ๋๋ฌธ์ ์๋ ๊ฒ์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์ข๋ค. Apple์ด ์ ๊ณตํ๋ Schedulerํ์ ๊ฐ์ฒด๋ DispatchQueue, OperationQueue, RunLoop ๋ฑ์ผ๋ก, ์ด๋ฏธ ์ด์ ๋ถํฐ ์๊ฐ๊ณผ ์ค๋ ๋ ์ ํ์ ์ํด ์ฌ์ฉํ๋ ๊ฐ์ฒด๋ค์ด๋ค. ์ฆ, ๊ธฐ์กด์ ์ฌ์ฉํ๋ ๊ฐ์ฒด๋ค ๊ทธ๋๋ก Combine์์๋ ์ฌ์ฉํ ์ ์๋ค. ๊ธฐ์กด์ DispatchQueue๋ฅผ ์ฌ์ฉํ ๋๋ Closure๋ฅผ ์ง์ ์ธ์๋ก ๋๊ฒจ์ผ ํด์ ์ค์ฒฉ๋ ํํ๋ก ์ฐ๋ค๋ณด๋ ์ฌ๋ฌ๋ฒ ์ค๋ ๋ ์ ํ์ ํ๊ฒ๋๋ฉด ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง ์ ๋ฐ์ ์์๋ ๊ฒ์ Combine์ ํฉ์ฑ ํํ๋ก ๋ฐ๊พธ์ด์ฃผ๋ฉด์ ๊ฐ๋ ์ฑ์ ๋์ผ ์ ์๋ค๋ ์ฅ์ ์ด ์๋ค.
[1,2,3,4,5,6,7,8,9,10].publisher
.subscribe(on:DispatchQueue.main) // ์ ์ฒด Publisher์ ๊ธฐ๋ณธ ๋์์ ๋ฉ์ธ ์ค๋ ๋์์ ์งํํ๋ค.(๋ฉ์ธ ์ค๋ ๋์์ ๋์)
.delay(for: 2, scheduler: DispatchQueue.global()) // ๋ฐฑ๊ทธ๋ผ์ด๋์์ 2์ด๊ฐ delay๋ฅผ ์ค๋ค. ์ด๋ ์ค๋ ๋๋ ๋ฐ๋๋ค.(๋ฐฑ๊ทธ๋ผ์ด๋ ์ค๋ ๋์์ ๋์)
.map({"\($0)"}) // Int๋ฅผ String์ผ๋ก ๋ฐ๊ฟ์ค๋ค.(๋ฐฑ๊ทธ๋ผ์ด๋ ์ค๋ ๋์์ ๋์)
.receive(on: DispatchQueue.main) // ์ดํ ๋์์ ๋ฉ์ธ ์ค๋ ๋์์ ์งํํ๋ค.
.sink(receiveValue: { s in
self.label.text = s // ๊ฐ์ ๋ฐ์์, label์ ์ธํ
ํ๋ค(๋ฉ์ธ ์ค๋ ๋์์ ๋์)
}).store(in: &self.cancelBag)์ด์ธ์ ๊ฐ์ ๋ก ๋๊ธฐ์ ์ผ๋ก ์ํํ๋๋ก ๋ง๋๋ ImmediateScheduler๊ฐ ์๋ค. ํด๋น ์ค์ผ์ฅด๋ฌ์๋ ์๊ฐ ์ต์ ์ ์ฃผ์ด๋ ์ด๋ฅผ ๋ฌด์ํ๊ณ ์ฆ์ ์คํํ๋ ํน์ง์ ๊ฐ์ง๊ณ ์๋ค.
Scheduler๋ฅผ ์ฌ์ฉํด์ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ ์ ํ ์ค๋ ๋์์, ์ ์ ํ ํ์ด๋ฐ์์ ๋์ํ๋๋ก ์กฐ์ ํ๋ฉด ์กฐ๊ธ ๋ ํจ๊ณผ์ ์ธ ๋ก์ง์ ์์ฑํ ์ ์๊ฒ ๋๋ค.
https://developer.apple.com/documentation/combine/scheduler
https://jcsoohwancho.github.io/2020-01-22-Combine-์์ํ๊ธฐ(4)-Scheduler/