๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
IOS๐ŸŽ/WWDC

[WWDC 2021] Meet AsyncSequence

by Jouureee 2022. 12. 18.

ํ•œ๋งˆ๋””๋กœ ์š”์•ฝํ•˜์ž๋ฉด sequence protocol์— async ๊ธฐ๋Šฅ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ protocol 
async/ await ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ๋น„๋™๊ธฐ๋ฅผ ์ข€ ๋” ํŽธ๋ฆฌํ•˜๊ฒŒ ๋‹ค๋ฃจ๊ฒŒ ํ–ˆ๋Š”๋ฐ collection type์— ๋Œ€ํ•ด ์šฐ๋ฆฌ๋Š” for, while ๊ฐ™์€ sequence ๋ฃจํ”„๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹จ ๋ง์ด์ง€ ?
ใ…‡ใ…‹ใ…‡ใ…‹ ์ด์— ๋Œ€ํ•œ async๋„ ๋งŒ๋“ค๊ฒ ์Œ ํ•ด์„œ ๋งŒ๋“ค์–ด์ง„ ํ”„๋กœํ† ์ฝœ --> AsyncSequence

์ฆ‰ sequence๋ฅผ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋งŒ๋“ค๊ฒ ๋‹ค๋Š” ๊ฒƒ๋งŒ ๋‹ค๋ฆ…๋‹ˆ๋‹ค ์„ธ์…˜์—์„œ๋„ sequence๋ฅผ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด ์ด๋ฏธ asynceSequence๋ฅผ ์•„๋Š”๊ฒƒ๊ณผ ๋‹ค๋ฆ„์ด ์—†๋‹ค๊ณ  ์–ธ๊ธ‰ํ•˜๊ณ  ์žˆ๋Š”๋ฐ์š” ์„ธ์…˜ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•ด๋ด…์‹œ๋‹ค.

 

asyncSequence๋ฅผ ์‚ฌ์šฉํ•œ ์ฝ”๋“œ๋Š” ์œ„์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.
์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ๋งŒ๋“ค์–ด์ง„ url์˜ lines์— ๋Œ€ํ•ด ์ฒซ๋ฒˆ์งธ ์ค„์„ ์ฝ๊ณ  dropํ•˜๋Š” dropFirst() ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ํ•œ์ค„์”ฉ event ๋ณ€์ˆ˜๋กœ ์ฝ๊ณ  ์žˆ๋Š”๋ฐ์—ฌ

 

์š” ๊ตฌ๋ฌธ์„ ์ž์„ธํžˆ ๋ณด๋ฉด line์˜ ๋น„๋™๊ธฐ ์‹œํ€€์Šค๊ฐ€ response ๋˜๋Š”๋Œ€๋กœ ๊ฐ ๋ผ์ธ์„ ๋ฐฉ์ถœํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

์˜คํ˜ธ await ํ•˜๊ณ  ์žˆ๋Š” ํ•จ์ˆ˜์˜ return ๊ฐ’์ด AsyncDropFirstSequence์ด๊ณ  ์ด๋Š” 

AsyncSequece ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•˜๊ณ  ์žˆ๋Š”๊ฑธ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด sequence์™€ asyncSequence๋Š” ๋ญ๊ฐ€ ๋‹ค๋ฅผ๊นŒ์š” ?
์ผ๋ฐ˜ sequence์™€ ๊ฐ™์ง€๋งŒ ๋ช‡๊ฐ€์ง€ ๋‹ค๋ฅธ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

1. ๊ฐ ์š”์†Œ๋Š” ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.
2. ๋น„๋™๊ธฐ ์ „๋‹ฌ์ด๊ธฐ ๋•Œ๋ฌธ์— ์‹คํŒจํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๊ณ  ์ด๋ฅผ throw ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
3. error๊ฐ€ ๋ฐœ์ƒํ•˜๊ฑฐ๋‚˜ throw ๋˜๋ฉด ์ข…๋ฅ˜๋ฉ๋‹ˆ๋‹ค. 

 

์ผ๋ฐ˜์ ์ธ for in ๋ฃจํ”„์˜ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.
์‹œํ€€์Šค์—์„œ ์ง€์ง„์„ ๋ฐ˜๋ณตํ•œ ๋‹ค์Œ ํฌ๊ธฐ๊ฐ€ ํŠน์ • ๊ฐ’์„ ์ดˆ๊ณผํ•˜๋ฉด displaySignificantEarthquake() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ด๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

makeIterator() ํ•จ์ˆ˜๋Š” Sequence ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•˜๋ฉด ๊ฐ€์ง€๊ฒŒ ๋˜๋Š” ํ•จ์ˆ˜์ด์ฃ .

quakes๋ฅผ makeIterator()๋ฅผ ํ†ตํ•ด interator๋กœ ๋งŒ๋“  ๋‹ค์Œ ๋งŒ๋“ค์–ด์ง„ iterator ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด next๊ฐ€ ํ˜ธ์ถœ๋ ๋•Œ iterator๊ฐ€ ์ƒ์„ฑํ•œ ๋ชจ๋“  ์ง€์ง„์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

์ด๋ฅผ ๋น„๋™๊ธฐ๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ€์ ธ์˜ค๋Š” ์ฝ”๋“œ๋ฅด ๋ณ€๊ฒฝํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.



๋งŒ์•ฝ ๊ฐ€์ ธ์˜ค๋Š” quakes sequence๊ฐ€ ๋‹ค์šด๋กœ๋“œ ์ž‘์—…์ด ํ•„์š”ํ•˜๋‹ค๋ฉด 

try๋ฅผ ์‚ฌ์šฉํ•ด error๋ฅผ throwํ• ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

๋‘๊ฐœ์˜ for in ๋ฌธ์€ ์ฒซ๋ฒˆ์งธ for in ๋ฌธ์ด ์‹คํ–‰๋œ ํ›„ ์•„๋ž˜ for in ๋ฌธ์ด ์‹คํ–‰๋˜๋Š”๋ฐ์š”. 

 

์ด๋ฅผ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„ 

Task๋กœ ์บก์Šํ™” ํ•˜์—ฌ ๋ณ‘๋ ฌ์ ์œผ๋กœ ์‹คํ–‰ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋‘๊ฐœ์˜ ๋ฐ˜๋ณต์„ ๋™์‹œ์— ์‹คํ–‰ํ•˜๊ณ  ๋‚˜์ค‘์— ๋ฐ˜๋ณต์„ ์ข…๋ฃŒํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.


asyncSequence๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” sequence ํ”„๋กœํ† ์ฝœ์˜ property๋“ค์„ ์†Œ๊ฐœํ•˜๊ณ  ์žˆ๋„ค์š” !!

์ž์‹ ๋งŒ์˜ ๋น„๋™๊ธฐ ์‹œํ€€์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์†Œ๊ฐœํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋น„๋™๊ธฐ ์‹œํ€€์Šค๋Š” callBack์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ delegate ํŒจํ„ด์„ ์‚ฌ์šฉํ• ๋•Œ ๋งค์šฐ ์œ ์šฉํ•œ๋ฐ์š”.

handler ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋Š” ์˜ˆ์‹œ๋ฅผ ๋ด๋ด…์‹œ๋‹ค.

QuakeMonitor๋ผ๋Š” ํด๋ž˜์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
ํด๋ž˜์Šค ์•ˆ์—๋Š” ํ•ธ๋“ค๋Ÿฌ์™€ quake ๋ชจ๋‹ˆํ„ฐ๋ฅผ ์‹œ์ž‘ํ•˜๊ณ , ์ค‘์ง€ํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

๊ธฐ์กด ์‚ฌ์šฉ๋ฒ•์€ ๋ชจ๋‹ˆํ„ฐ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋Š” handler๋ฅผ ํ• ๋‹นํ•œ ๋‹ค์Œ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์‹œ์ž‘ํ•˜์—ฌ handler์—๊ฒŒ ์ง€์ง„์˜ ๊ฐ’์„ ๋ณด๋‚ด๊ณ  ๋‚˜์ค‘์— ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค.

 


์ด๋ฅผ AsyncStream์„ ์‚ฌ์šฉํ•ด asyncSequence๋ฅผ ์ƒ์„ฑ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

AsyncStream์˜ ํด๋กœ์ €๋กœ continuation์„ ๋ฐ›์•„์˜ค๋Š”๋ฐ์š”. continuation์„ ํ†ตํ•ด handler์—์„œ quake๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๊ณ (yield),  onTermination์„ ํ†ตํ•ด ๋ชจ๋‹ˆํ„ฐ๋ง์„ stopํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.



์ด์ „์— ์‚ฌ์šฉํ–ˆ๋˜ ๊ฒƒ๊ณผ ๋™์ผํ•œ ๋ชจ๋‹ˆํ„ฐ ์ฝ”๋“œ๋ฅผ ๋น„๋™๊ธฐ ์ŠคํŠธ๋ฆผ ๊ตฌ์„ฑ ๋‚ด์—์„œ ์‰ฝ๊ฒŒ ์บก์Šํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์•„๋ž˜์™€ ๊ฐ™์ด asyncStream์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. 

 

AsyncStream์„ ์‚ฌ์šฉํ•ด ๊ณ ์œ ํ•œ asyncSequence๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ buffering๊ณผ cancellation์„ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

์˜ค๋ฅ˜๋ฅผ ๋‚˜ํƒ€๋‚ด์•ผ ํ•œ๋‹ค๋ฉด ?

AsyncThrowingStream์„ ํ†ตํ•ด error๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

 

asyncStream์— ๋Œ€ํ•ด์„ 

https://minsone.github.io/swift-concurrency-asyncstream-AsyncThrowingStream

https://zeddios.tistory.com/1341

๋ธ”๋กœ๊ทธ์—์„œ ๋” ์ž์„ธํ•˜๊ฒŒ ์˜ˆ์‹œ๋ฅผ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

AsyncSequence๋Š” ๋‘˜ ์ด์ƒ์˜ ๋น„๋™๊ธฐ ๊ฐ’์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ์•ˆ์ „ํ•˜๊ณ  ์นœ์ˆ™ํ•œ ๋งค์šฐ ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.

 

'IOS๐ŸŽ > WWDC' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[WWDC 2021] Make blazing fast lists and collection views  (0) 2022.05.27
[WWDC 2021] Your guide to keyboard layout  (0) 2022.05.26
[WWDC 2021] Protect mutable state with Swift actors  (0) 2022.05.24
[WWDC 2021] Meet async/await in Swift  (0) 2022.05.17
[WWDC 2020] Advances in diffable data sources  (0) 2022.05.12

๋Œ“๊ธ€