-
[Swift] Understanding Swift Concurrency’s AsyncStreamSwift 2023. 8. 17. 09:25
์ด์ ๊ธ์์ ๊ธฐ์กด์ ๋น๋๊ธฐ ์ฝ๋๋ฅผ async/await์ ํ์ฉํ๋ Swift์ ์๋ก์ด ๋์์ฑ ์์คํ ์ผ๋ก ์ฐ๊ฒฐํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ํด ์ค๋ช ํ์ต๋๋ค. ์ฌ๊ธฐ์ ์ค๋ช ํ ๋ฉ์ปค๋์ฆ์ ์ฝ๋๊ฐ ๋จ์ผ ๊ฐ์ผ๋ก ๋ชจ๋ธ๋งํ ์ ์๋ ๋จ์ผ ๊ฒฐ๊ณผ๋ฅผ ์์ฑํ๋ ์ฝ๋์ ์ ํฉํฉ๋๋ค.
๋ค์ด๋ก๋ ์งํ๋ฅ , ์ฌ์ฉ์์ ํ์ฌ ์์น์ ๊ฐ์ด ์๊ฐ์ ๋ฐ๋ผ ์ฌ๋ฌ ๊ฐ์ ์ ๊ณตํ๋ ๊ฒฝ์ฐ, ๋น๋๊ธฐ for ๋ฃจํ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ๋ณตํ ์ ์๋ AsyncSequence ๊ฐ์ฒด๋ก ๋ชจ๋ธ๋งํ ์ ์์ต๋๋ค. ์ด์ ๋ํ ๊ธฐ๋ณธ์ ์ธ ์์ ๋ก URL์ lines ์์ฑ์ ๋ค ์ ์์ต๋๋ค.
let url = URL(string: "<https://donnywals.com>")! for try await line in url.lines { // use line }๊ทธ๋ ๋ค๋ฉด ์ปค์คํ ๋น๋๊ธฐ ์ํ์ค๋ฅผ ์์ฑํ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ๋ฌด์์ผ๊น์?
AsyncSequence ํ๋กํ ์ฝ์ ๊ตฌํํ๊ณ AsyncIterator์์ ๋น๋ํ๋ ๊ฒ์ ์ง๋ฃจํ๊ณ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ์ฝ์ต๋๋ค. ๋คํํ๋ ์ด๋ฐ ์์ ์ ํ ํ์๊ฐ ์์ต๋๋ค.
์ด ๊ธ์์๋ Swift์ AsyncStream์ ํ์ฉํ์ฌ ํ์ํ ๋๋ง๋ค ๊ฐ์ ์์ฑํ๋ ์ฌ์ฉ์ ์ ์ async ์ํ์ค๋ฅผ ๋น๋ํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ๋๋ฆฌ๊ฒ ์ต๋๋ค.
๊ฐ๋จํ ๋น๋๊ธฐ ์คํธ๋ฆผ (async stream) ์์ฑํ๊ธฐ
๋น๋๊ธฐ ์คํธ๋ฆผ์ ๋ค์ํ ๋ฐฉ๋ฒ์ผ๋ก ์์ฑํ ์ ์์ต๋๋ค. ๋น๋๊ธฐ ์คํธ๋ฆผ์ ์์ฑํ๋ ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์AsyncStream(unfolding:) ์์ฑ์๋ฅผ ์ด์ฉํ๋ ๊ฒ์ ๋๋ค.
let stream = AsyncStream(unfolding: { return Int.random(in: 0..<Int.max) })๋ฌผ๋ก ์ด ์์ ๊ฐ ์ ์ฉํ์ง ์์ง๋ง, AsyncStream(unfolding:)์ ๊ฐ๋ ์ ์ผ๋ง๋ ๊ฐ๋จํ์ง ์ ์ ์์ต๋๋ค.
์ฐ๋ฆฌ๋ AsyncStream์ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ ์คํธ๋ฆผ์ ์์ฑํ๊ณ ๋ฐํํ ๊ฐ์ ์์ฑํ ์ ์์ต๋๋ค. unfolding์ ์ ๋ฌ๋๋ ํด๋ก์ ๋ ๋น๋๊ธฐ์ด๋ฏ๋ก ํด๋ก์ ๋ด์์ ๋น๋๊ธฐ ์ฐ์ฐ์ ๊ธฐ๋ค๋ฆด ์ ์์ต๋๋ค. ์คํธ๋ฆผ์ ๋ํ ๊ฐ์ ์์ฑํ๊ธฐ ์์ํ ๊ฒ์ผ๋ก ์์๋ ๋๋ง๋ค unfolding ํด๋ก์ ๊ฐ ํธ์ถ๋ฉ๋๋ค. ์ค์ ๋ก๋ ํด๋ก์ ๊ฐ ํธ์ถ๋์ด ์์ ์ ์ํํ๊ณ , ๊ฐ์ ๋ฐํํ ๋ค์ ํด๋ก์ ๊ฐ ํธ์ถ๋๋ค๋ ๋ป์ ๋๋ค. ์ด ๊ณผ์ ์ for ๋ฃจํ๊ฐ ์ทจ์๋๊ฑฐ๋ ๋น๋๊ธฐ for loop๋ฅผ ํฌํจํ๋ ์์ ์ด ์ทจ์๋๊ฑฐ๋, unfolding ํด๋ก์ ์์ nil์ ๋ฐํํ ๋๊น์ง ๊ณ์๋ฉ๋๋ค.
AsyncStream(unfolding:)์ ์ฌ์ฉํ์ฌ ๊ฐ ์คํธ๋ฆผ์ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๋งค์ฐ ํธ๋ฆฌํ์ง๋ง ํนํ ๋ค์๊ณผ ๊ฐ์ ์ํฉ์์ ์ ์ฉํฉ๋๋ค.
- ๊ฐ์ ์์ฑํ๊ธฐ ์ํด ๊ธฐ๋ค๋ ค์ผ ํ๋ ๋น๋๊ธฐ ์์ ์ ์ํํ๋ ค๋ ๊ฒฝ์ฐ
- API๋ฅผ ๋ธ๋ฆฟ์งํ๋ ๋์ ๋ฐฑ ํ๋ ์ ๋ฅผ ์ฒ๋ฆฌํด์ผ ํ๋ ๊ฒฝ์ฐ
๋ธ๋ฆฌ๊ฒ์ดํธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ๊ธฐ์กด API๋ฅผ ๋ธ๋ฆฌ์งํ๊ฑฐ๋ ์ฝ๋ฐฑ์ ํ์ฉํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ์ ๋ฌํ๋ API์ ๊ฒฝ์ฐ, AsyncStream(unfolding:)์ ์ฌ์ฉํ ์ ์์ ๊ฒ์ ๋๋ค.
AsyncStream(unfolding:)์ ๊ฐ์ฅ ๊ฐ๋จํ๊ณ ์ค๋ฅ๊ฐ ์ ๊ฒ ๋ฐ์ํ๋ ๋ฐฉ๋ฒ์ด์ง๋ง, ๊ธฐ์กด ์ฝ๋๋ฅผ Swift Concurrency๋ก ์ฐ๊ฒฐํ๋ ๋ฐ ๊ฐ์ฅ ์ ํ์ ์ด๋ฉฐ ์ ํฉํ์ง ์์ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
AsyncStream์ ๋ํ continuation API์์ ๋ ๋ง์ ์ ์ฐ์ฑ์ ์ฐพ์ ์ ์์ต๋๋ค.
continuation์ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ ์คํธ๋ฆผ (async stream) ์์ฑํ๊ธฐ
๋น๋๊ธฐ ํด๋ก์ ๊ฐ ์์ฒด ๋น๋๊ธฐ ์คํธ๋ฆผ์ ์์ฑํ๋ ๋ฐ ์ ํฉํ์ง ์์ ๊ฒฝ์ฐ, continuation ๊ธฐ๋ฐ ์ ๊ทผ ๋ฐฉ์์ด ํจ์ฌ ๋ ๋์ ํด๊ฒฐ์ฑ ์ด ๋ ์ ์์ต๋๋ค. continuation์ ์ฌ์ฉํ๋ฉด ๋น๋๊ธฐ ์คํธ๋ฆผ ๊ฐ์ฒด๋ฅผ ๊ตฌ์ฑํ๊ณ ๊ฐ์ ์ฌ์ฉํ ์ ์๊ฒ ๋ ๋๋ง๋ค ๋น๋๊ธฐ ์คํธ๋ฆผ์ ํตํด ๊ฐ์ ์ ์กํ ์ ์์ต๋๋ค.
๋ค์๊ณผ ๊ฐ์ด AsyncStream(build:) ์์ฑ์๋ฅผ ์ฌ์ฉํด ๋น๋๊ธฐ ์คํธ๋ฆผ์ ์์ฑํ ์ ์์ต๋๋ค.
let stream2 = AsyncStream { continuation in continuation.yield(Int.random(in: 0..<Int.max)) }์์ ์์ ๋ ํ๋์ ์ ์ ๊ฐ์ ์์ฑํ๋ ๋น๋๊ธฐ ์คํธ๋ฆผ์ ์์ฑํฉ๋๋ค. ์ด ๊ฐ์ continuation์์ yield๋ฅผ ํธ์ถํ์ฌ ์์ฑํฉ๋๋ค. ์ ์กํ ๊ฐ์ด ์์ ๋๋ง๋ค continuation์์ yield๋ฅผ ํธ์ถํด์ผ ํฉ๋๋ค.
๋ธ๋ฆฌ๊ฒ์ดํธ ๊ธฐ๋ฐ API๋ฅผ ๋ํํ๋ AsyncStream์ ์์ฑํ ๊ฒฝ์ฐ, ๋ธ๋ฆฌ๊ฒ์ดํธ ๊ฐ์ฒด์ continuation์ ๋ณด์ (์ ์ง)ํ๊ณ ๊ด๋ จ ๋ธ๋ฆฌ๊ฒ์ดํธ ๋ฉ์๋๊ฐ ํธ์ถ๋ ๋๋ง๋ค yield๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, ์๋ก์ด ์ฌ์ฉ์์ ์์น๋ฅผ ์ฌ์ฉํ ์ ์์ ๋๋ง๋ค CLLocationManagerDelegate ๋ด์์ contiunation.yield๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค.
class AsyncLocationStream: NSObject, CLLocationManagerDelegate { lazy var stream: AsyncStream<CLLocation> = { AsyncStream { (continuation: AsyncStream<CLLocation>.Continuation) -> Void in self.continuation = continuation } }() var continuation: AsyncStream<CLLocation>.Continuation? func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { for location in locations { continuation?.yield(location) } } }์์ ์์ ๋ ์ฌ์ฉ์ ์์น์ ๋น๋๊ธฐ ์คํธ๋ฆผ์ ๋ง๋ค๊ธฐ ์ํ ๋งค์ฐ ๊ธฐ๋ณธ์ ์ธ ์์์ ์ ๋๋ค. ์์น ๊ด์ฐฐ์ ์ทจ์ ๋ฐ ์์ํ๊ฑฐ๋ ์์น ๊ถํ์ ์์ฒญํ๋ ๋ฑ ์์ ํ ๊ณ ๋ คํ์ง ์์ ๋ช ๊ฐ์ง ์ฌํญ์ด ์์ต๋๋ค.
ํ์ง๋ง ๊ธฐ๋ณธ์ ์ผ๋ก ์ด ์์ ๋ ๋น๋๊ธฐ ์คํธ๋ฆผ์ ์คํํ๊ธฐ ์ํ ์ข์ ์ถ๋ฐ์ ์ด ๋ ์ ์์ต๋๋ค.
์ด ์ ๊ทผ ๋ฐฉ์์ ๋น๋๊ธฐ ์คํธ๋ฆผ์ ์๋น์๊ฐ ๋ค์ ๊ฐ์ ์คํธ๋ฆผ์ผ๋ก ๋ณด๋ด๊ธฐ ์ ์ ์ด์ ๊ฐ์ ์์ ํ ์๋นํ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค. ๋์ ์ ์กํ๋ ๋ชจ๋ ๊ฐ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋น๋๊ธฐ ์คํธ๋ฆผ์์ ๋ฒํผ๋ง๋๋ฉฐ, ์ด๋ ์ฌ์ฉ์๊ฐ ์ํ๋ ๊ฐ์ผ ์๋ ์๊ณ ์๋ ์๋ ์์ต๋๋ค.
์ฆ, ์ค์ ๋ก ์๋น์๊ฐ ๊ฐ์ ์ฒ๋ฆฌํ๋ ์๋๋ณด๋ค ๋ ๋น ๋ฅธ ์๋๋ก ๊ฐ์ ๋ณด๋ผ ๊ฒฝ์ฐ, ๋ฒํผ๊ฐ ๊ฐ๋ ์ฐจ๊ฒ ๋๋ฉฐ ์๋นํ๋ for ๋ฃจํ์ ๊ฐ์ด ์ง์ฐ๋์ด ์ ๋ฌ๋ฉ๋๋ค. ์ด๋ ์ ํํ ํ์ํ ๊ฒ์ผ ์๋ ์์ง๋ง ์ ์กํ๋ ๊ฐ์ด ๋ค์ ์๊ฐ์ ๋ฏผ๊ฐํ๊ณ ์ผ์์ ์ธ ๊ฒฝ์ฐ, ์๋นํ๋ for ๋ฃจํ๊ฐ ๊ฐ์ ๋ฐ์ ์ค๋น๊ฐ ๋์ง ์์์ ๋ ๊ฐ์ ๋ฒ๋ฆฌ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ผ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด ์ค๋๋ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ์ง ์๊ธฐ ์ํด 1๊ฐ ์ด์์ ์์น๋ฅผ ๋ณด์ ํ์ง ์๊ณ ๋ง์ง๋ง์ผ๋ก ์๋ ค์ง ์์น๋ง ๋ฒํผ๋งํ๊ธฐ๋ก ๊ฒฐ์ ํ ์ ์์ต๋๋ค. ๋น๋๊ธฐ ์คํธ๋ฆผ์ ๋ค์๊ณผ ๊ฐ์ ๋ฒํผ๋ง ์ ์ฑ ์ ์ค์ ํ๋ฉด ์ด ์์ ์ ์ํํ ์ ์์ต๋๋ค:
lazy var stream: AsyncStream<CLLocation> = { AsyncStream(bufferingPolicy: .bufferingNewest(1)) { (continuation: AsyncStream<CLLocation>.Continuation) -> Void in self.continuation = continuation } }()์ด ์ฝ๋๋ ๋ฒํผ๋ง ์ ์ฑ ์ผ๋ก .bufferingNewest(1)๋ฅผ AsyncStream์ ์ ๋ฌํฉ๋๋ค. ์ฆ, for ๋ฃจํ๊ฐ ํญ๋ชฉ์ ์ถฉ๋ถํ ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌํ์ง ๋ชปํ๋ ๊ฒฝ์ฐ ๋จ์ผ ๊ฐ๋ง ๋ฒํผ๋งํ๊ณ , ์ต์ ์์น๋ง ์ ์งํ๊ธฐ ์ํด ์ด์ ๊ฐ์ ๋ฒ๋ฆฝ๋๋ค.
์คํธ๋ฆผ์ด ์์ฐ์ค๋ฝ๊ฒ ์ข ๋ฃ๋๋ฉด continuation์ finish()๋ฅผ ํธ์ถํ์ฌ ๊ฐ ์คํธ๋ฆผ์ ์ข ๋ฃํ ์ ์์ต๋๋ค.
์คํธ๋ฆผ์ด ์๋ฌ์ ํจ๊ป ์คํจํ ์ ์๋ ๊ฒฝ์ฐ AsyncStream ๋์ ์ AsyncThrowingStream์ ์์ฑํ ์๋ ์์ต๋๋ค. ์ฃผ์ ์ฐจ์ด์ ์ ์๋ฌ๋ฅผ throwํ๋ ์คํธ๋ฆผ์ ์๋น์๋ try await ๋์ ์ ๋จ์ํ await๋ฅผ ์ฌ์ฉํ์ฌ ์ ๊ฐ์ ๊ธฐ๋ค๋ ค์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค. ์คํธ๋ฆผ์ด ์๋ฌ๋ฅผ throwํ๊ฒ ๋ง๋ค๋ ค๋ฉด continuation์์ finish(throwing:)๋ฅผ ํธ์ถํ๊ฑฐ๋ Result ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ yield(with:)๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค.
๋น๋๊ธฐ ์คํธ๋ฆผ์ ๊ตฌ์ถํ๋ ๊ธฐ๋ณธ ์ฌํญ์ ํน๋ณํ ๋ณต์กํ์ง๋ ์์ง๋ง, ์ฐ๋ฆฌ๊ฐ ์์ฑํ๋ ๊ฐ์ฒด์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ์ด๋ป๊ฒ ๊ด๋ฆฌํ ์ง ์ ์คํ๊ฒ ์๊ฐํด์ผ ํฉ๋๋ค. ํนํ ๊ธฐ์กด ๋ธ๋ฆฌ๊ฒ์ดํธ ๊ธฐ๋ฐ ์ฝ๋๋ฅผ ๋ธ๋ฆฌ์งํ ๋ continuation์ด ์คํธ๋ฆผ๋ณด๋ค ์ค๋ ์ ์ง๋์ง ์๋๋ก ์ฃผ์ํด์ผ ํฉ๋๋ค.
์คํธ๋ฆผ ์๋ช ์ฃผ๊ธฐ ๊ด๋ฆฌํ๊ธฐ
๋น๋๊ธฐ ์คํธ๋ฆผ์ด ์ข ๋ฃ๋๋ ๋ฐฉ๋ฒ์๋ ๊ธฐ๋ณธ์ ์ผ๋ก 2๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
์ฒซ์งธ, ๋ ์ด์ ๊ฐ์ด ์์ฑ๋์ง ์์ ์คํธ๋ฆผ์ด ์์ฐ์ค๋ฝ๊ฒ ๊ฐ ์์ฑ์ ์ข ๋ฃํ ์ ์์ต๋๋ค. continuation์ finish๋ฅผ ํธ์ถํ๊ณ ๋์์ ์ํํด์ผ ํ ๋ชจ๋ ์ ๋ฆฌ ์์ ์ ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์๋์น ์๊ฒ ๋ ์ด์ continuation์ ์ฌ์ฉํ์ง ์๋๋ก continuation์ nil๋ก ์ค์ ํ ์ ์์ต๋๋ค.
๋๋, ๋น๋๊ธฐ ์คํธ๋ฆผ์ ์คํํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์์ ์ด ์ทจ์๋์ด ์คํธ๋ฆผ์ด ์ข ๋ฃ๋ ์ ์์ต๋๋ค. ๋ค์์ ๊ณ ๋ คํ์ธ์.
let locations = AsyncLocationStream() let task = Task { for await location in locations.stream { print(location) } } task.cancel()์์ ๊ฐ์ ์ํฉ์ด ๋ฐ์ํ๋ฉด ์ด๋ฏธ ์๋ฃ๋ ์คํธ๋ฆผ์ ๊ฐ์ ๋ณด๋ด์ง ์๋๋ก continuation์ yield๋ฅผ ํธ์ถํ์ง ์์์ผ ํฉ๋๋ค. ์ด๋ฌํ ์ข ๋ฃ๋ฅผ ๊ฐ์งํ๊ณ ๋์ํ๊ธฐ ์ํด continuation์ onTermination ํธ๋ค๋ฌ๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค:
self.continuation?.onTermination = { result in print(result) self.continuation = nil }๊ฐ๋ฅํ๋ฉด ์ด ํธ๋ค๋ฌ๋ฅผ ๋น๋๊ธฐ ์คํธ๋ฆผ์ ์ฒ์ ์์ฑํ ๋ ์ฆ์ ์ค์ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋ํ ์คํธ๋ฆผ์ด ์ทจ์๋๊ฑฐ๋ ๋ค๋ฅธ ๋ฒ์๋ฅผ ๋ฒ์ด๋ ๊ฒฝ์ฐ์๋ ๋ฃจํ๋ฅผ ํ์ถํ ์ ์์ผ๋ฏ๋ก ์์ ์ด ์ข ๋ฃ๋ฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ด ๊ฒฝ์ฐ ์คํธ๋ฆผ์ด ์ข ๋ฃ๋๋ ๊ฒ์ด ์๋๋ฏ๋ก, ๋ฃจํ๋ฅผ ํ์ถํ์ฌ ์คํธ๋ฆผ์ ์ข ๋ฃํ๋ ค๋ฉด ์ด ์ ์ ์ง์ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
๊ธ์ ์์ฑ์๋ ๊ฐ์ธ์ ์ผ๋ก ์คํธ๋ฆผ์ ๊ฐ์ฅ ์ฝ๊ฒ ์ ๋ฆฌํ ์ ์๋ ๋ฐฉ๋ฒ์ ์คํธ๋ฆผ์ ์์ฑํ๋ ๊ฐ์ฒด์ ๋น๋๊ธฐ ๋ฃจํ์์ ๋ฒ์ด๋๋ ๋์ ์คํธ๋ฆผ์ ์ทจ์ํ๋ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ ๋ฆฌ๋ฅผ ์ํํ๊ณ ์๋ฌด๋ ์์ ํ์ง ์๋๋ฐ๋ ๊ฐ์ ์ ์กํ๋ ์คํธ๋ฆผ์ ๋ง๋ค์ง ์์ ์ ์์ต๋๋ค.
๋ํ ์์ ์ค๋ช ํ ํจํด์ ํ ๋ช ์ ์๋น์๊ฐ ์์น ์คํธ๋ฆผ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ง ์๋ํ๋ค๋ ์ ์ ๋ช ์ฌํด์ผ ํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๋น๋๊ธฐ ์ํ์ค์๋ ๋ฐ๋ณต์ ์ฌ๋ฌ ๋ฃจํ์ ๊ณต์ ํ๋ ๊ธฐ๋ฅ์ด ์๊ธฐ ๋๋ฌธ์ Swift Concurrency์์๋ ๋จ์ผ ์คํธ๋ฆผ์ ๋ฐ๋ณตํ๋ ๋ฃจํ์ ๋ํด ์ฌ๋ฌ ๊ฐ์ ๋ฃจํ๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค.
In Summary
์ด ํฌ์คํ ์์๋ ๋น๋๊ธฐ ์คํธ๋ฆผ๊ณผ ์์ ๋ง์ ๋น๋๊ธฐ ์ํ์ค๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ํด ๋ง์ ๊ฒ์ ๋ฐฐ์ ์ต๋๋ค. ๋จผ์ , ๋น๋๊ธฐ ์คํธ๋ฆผ์ ๋น๋ํ๋ ์ธํด๋ฉ ์ ๊ทผ ๋ฐฉ์์ ์ดํด๋ณด๊ณ ์ด ์ ๊ทผ ๋ฐฉ์์ ๋น๊ต์ ๊ฐ๋จํ์ง๋ง ๊ธฐ์กด ๋ธ๋ฆฌ๊ฒ์ดํธ ๋๋ ์ฝ๋ฐฑ ๊ธฐ๋ฐ API๋ฅผ ์ฐ๊ฒฐํด์ผ ํ๋ ์ฌ๋๋ค์๊ฒ๋ ๊ทธ๋ค์ง ์ ์ฉํ์ง ์์ ์ ์๋ค๋ ๊ฒ์ ๋ฐฐ์ ์ต๋๋ค.
์ธํด๋ฉ์ ๋ํด ์ ์ ์ดํด๋ณธ ํ ๋น๋๊ธฐ ์คํธ๋ฆผ์ ๋ํ ๋น๋ ํด๋ก์ ์ ๋ํด ์ดํด๋ณด์์ต๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ํ์ํ ๋ ํธ์ถํ์ฌ ๊ฐ์ ์์ฑํ ์ ์๋ ์ฐ์ ๊ฐ์ฒด๋ฅผ ํ์ฉํ๋ค๋ ๊ฒ์ ๋ฐฐ์ ์ต๋๋ค.
CLLocationManager๋ฅผ ๋น๋๊ธฐ ๋๊ธฐ ์ํ๋ก ์ฐ๊ฒฐํ๋ ๊ฐ์ฒด์ ์์ฃผ ๊ธฐ์ด์ ์ธ ์์ ๋ฅผ ๋ณด์ จ๊ณ , ์ด๋ฏธ ์๋ฃ๋ ์คํธ๋ฆผ์ผ๋ก ๊ฐ์ ๋ณด๋ด์ง ์๋๋ก ์ฐ์์ ์ฌ๋ฐ๋ฅด๊ฒ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ํด ๋ฐฐ์ ์ต๋๋ค.
์๋ฌธ
https://www.donnywals.com/understanding-swift-concurrencys-asyncstream/
'Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ