Search

[WWDC] Efficiency awaits: Background tasks in SwiftUI

๐ŸŽ

๋“ค์–ด๊ฐ€๋ฉฐ

์ด๋ฒˆ ์„ธ์…˜์—์„œ ์•Œ์•„๋ณผ ๊ฒƒ์€ ์ƒˆ SwiftUI API ์ž…๋‹ˆ๋‹ค.
๋ชจ๋“  Apple ํ”Œ๋žซํผ์—์„œ Swift Concurrency๋ฅผ ์ด์šฉํ•ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์„ ์ผ๊ด€์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
API์˜ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—… ์ฒ˜๋ฆฌ๊ฐ€ Swift Concurrency๋กœ ์–ผ๋งˆ๋‚˜ ์‰ฌ์›Œ์กŒ๋Š”์ง€ ์‚ดํŽด๋ด…์‹œ๋‹ค!
โ€ข
์ƒˆ๋กœ์šด API๋Š” watchOS, iOS, tvOS, Mac Catalyst, ์œ„์ ฏ ๋ฐ Mac์—์„œ ์‹คํ–‰ํ•˜๋Š” iOS ์•ฑ๊นŒ์ง€ ๋ชจ๋‘ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ํ•œ ํ”Œ๋žซํผ์—์„œ ๋ฐฐ์šด ๊ฐœ๋…๊ณผ ํŒจํ„ด์„ ๋‹ค๋ฅธ ๊ณณ์—๋„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป์ด์ฃ .
โ€ข
Swift Concurrency๋ฅผ ํ™œ์šฉํ•˜๋Š” ์ƒˆ API๋Š” ๊นŠ์ด ์ค‘์ฒฉ๋œ completion Handler์™€ ์ฝœ๋ฐฑ ๋ฐ ์ข…์ข… ๋ถ€์ž‘์šฉ์„ ์ผ์œผ์ผฐ๋˜ ๊ฐ€๋ณ€ ์ƒํƒœ์˜ ํ•„์š”์„ฑ์„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
โ€ข
Swift Concurrency์˜ ๋„ค์ดํ‹ฐ๋ธŒ ์ž‘์—… ์ทจ์†Œ๋Š” ์•ฑ์ด ์‹œ๊ฐ„์— ๋งž์ถฐ ์ž‘์—…์„ ์™„๋ฃŒํ•˜๋„๋ก ๋„์›€์œผ๋กœ์จ ์‹œ์Šคํ…œ์ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์•ฑ์„ ์ข…๋ฃŒํ•˜๋Š” ๊ฒƒ์„ ํ”ผํ•ฉ๋‹ˆ๋‹ค.

โ€˜Stormyโ€™

ํญํ’์šฐ ์น˜๋Š” ๋‚  ํ•˜๋Š˜ ์‚ฌ์ง„์„ ์ฐ๋Š” ์•ฑ์œผ๋กœ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์„ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค.
ํญํ’์šฐ๊ฐ€ ์น˜๋ฉด ํ•˜๋Š˜ ์‚ฌ์ง„์„ ์ฐ์œผ๋ผ๊ณ  ์•Œ๋ ค ์ฃผ๋Š” ์•ฑ
๋„ํ‘œ๋ฅผ ๋ณด๋ฉด์„œ ํญํ’์šฐ ์น˜๋Š” ๋‚ ์—๋งŒ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์„ ์‚ฌ์šฉํ•˜์—ฌ ์•Œ๋ฆผ์„ ์ „์†กํ•˜๋Š” ๋ฒ•์„ ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
์™ผ์ชฝ์— ๋ณด์ด๋Š” ๋ง‰๋Œ€: foreground ์•ฑ์˜ ์‹คํ–‰ ์‹œ๊ฐ„
์ค‘๊ฐ„์— ์žˆ๋Š” ๋ง‰๋Œ€: background ์•ฑ์˜ ์‹คํ–‰ ์‹œ๊ฐ„
์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š” ๋ง‰๋Œ€: ์‹œ์Šคํ…œ ์•ฑ ์‹คํ–‰ ์‹œ๊ฐ„
โ€ข
์•ฑ์—์„œ ๋‚˜๊ฐ€์„œ ์•ฑ์ด ์ผ์‹œ ์ •์ง€๋˜๋ฉด ์‹œ์Šคํ…œ์€ ์˜ˆ์•ฝํ•œ ์‹œ๊ฐ„์— ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์•ฑ์„ ๊นจ์›Œ์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•ฉ๋‹ˆ๋‹ค.
โ€ข
์ •์˜ค์— ์•ฑ์„ ์˜ˆ์•ฝํ–ˆ์œผ๋ฏ€๋กœ ์‹œ์Šคํ…œ์€ ์ •์˜ค์— ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์•ฑ์„ ๊นจ์šฐ๊ณ  ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์•ฑ ์ƒˆ๋กœ๊ณ ์นจ ์ž‘์—…์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค
โ€ข
๋ฐฑ๊ทธ๋ผ์šด๋“œ ์‹คํ–‰ ์‹œ๊ฐ„์— ์šฐ๋ฆฌ๋Š” ํญํ’์šฐ๊ฐ€ ์น˜๋Š”์ง€ ์•Œ์•„๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‚ ์ด ํ๋ฆฌ๋‹ค๋ฉด ์‚ฌ์šฉ์ž์—๊ฒŒ ์•Œ๋ฆผ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์šฐ์„  ๋‚ ์”จ ์„œ๋น„์Šค์— ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ๋ณด๋‚ด์„œ ํ˜„์žฌ ๋‚ ์”จ๋ฅผ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
โ€ข
๋ฐฑ๊ทธ๋ผ์šด๋“œ์— ์˜ˆ์•ฝ๋œ URLSession์œผ๋กœ ์•ฑ์€ ์ผ์‹œ ์ •์ง€ ์ƒํƒœ๋กœ๋„ ๋„คํŠธ์›Œํฌ ์š”์ฒญ์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
โ€ข
๋ฐฑ๊ทธ๋ผ์šด๋“œ ๋„คํŠธ์›Œํฌ ์š”์ฒญ์œผ๋กœ ๋‚ ์”จ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์œผ๋ฉด ์ƒˆ๋กœ์šด URLSession ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์œผ๋กœ ์•ฑ์— ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์‹คํ–‰ ์‹œ๊ฐ„์ด ๋‹ค์‹œ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค.
์š”์ฒญํ•œ ๋‚ ์”จ ๋ฐ์ดํ„ฐ๋ฅผ ์ž…์ˆ˜ํ•˜๋ฉด ์•ฑ์€ ๋ฐ–์— ํญํ’์šฐ๊ฐ€ ์น˜๋Š”์ง€ ํŒ๋‹จํ•˜๊ณ  ์‚ฌ์ง„์„ ์ฐ์œผ๋ผ๋Š” ์•Œ๋ฆผ์„ ๋ณด๋‚ผ ๊ฒƒ์ธ์ง€ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

Background on Background Task

๋‹จ์ผ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์˜ ์ž‘๋™ ๋ฐฉ์‹์„ ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
๋‹จ์ผ ์•ฑ์„ ์ƒˆ๋กœ๊ณ ์นจํ•˜๋Š” ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์˜ ์ˆ˜๋ช… ์ฃผ๊ธฐ
โ€ข
๋จผ์ € ์‹œ์Šคํ…œ์ด ์•ฑ์„ ๊นจ์šฐ๊ณ  ์•ฑ ์ƒˆ๋กœ๊ณ ์นจ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
โ€ข
๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ƒํƒœ์—์„œ ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ๋ณด๋‚ด ํญํ’์šฐ๊ฐ€ ์น˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
โ€ข
์ด์ƒ์ ์ธ ์ƒํ™ฉ์€ ์šฐ๋ฆฌ ๋„คํŠธ์›Œํฌ ์š”์ฒญ์ด ์ƒˆ๋กœ๊ณ ์นจ์„ ์œ„ํ•ด ์•ฑ์— ํ• ๋‹น๋œ ์‹คํ–‰ ์‹œ๊ฐ„ ์•ˆ์— ๋ชจ๋‘ ์™„๋ฃŒ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์•Œ๋ฆผ์ด ๊ฒŒ์‹œ๋˜๋ฉด ์•ฑ ์ƒˆ๋กœ๊ณ ์นจ ์ค‘์— ํ•„์š”ํ•œ ๊ฑด ๋ชจ๋‘ ๋งˆ์ณค์œผ๋ฏ€๋กœ ์‹œ์Šคํ…œ์ด ๋‹ค์‹œ ์•ฑ์„ ์ผ์‹œ ์ •์ง€์‹œํ‚ต๋‹ˆ๋‹ค.

๋‚ ์”จ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ๋„คํŠธ์›Œํฌ ์š”์ฒญ์ด ์ œ๋•Œ ์•ˆ ๋๋‚˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?

โ€ข
์•ฑ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์‹คํ–‰ ์‹œ๊ฐ„์„ ๋ชจ๋‘ ์†Œ๋น„ํ–ˆ๋‹ค๋ฉด ์‹œ์Šคํ…œ์ด ์•ฑ์— ์‹œ๊ฐ„์ด ๋ถ€์กฑํ•˜๋‹ค๊ณ  ์•Œ๋ ค์„œ ์ƒํ™ฉ์— ๋Œ€๋น„ํ•  ๊ธฐํšŒ๋ฅผ ์ค๋‹ˆ๋‹ค.
โ€ข
์‹คํ–‰ ์‹œ๊ฐ„์ด ๋งŒ๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ์•ฑ์ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์„ ์™„๋ฃŒํ•˜์ง€ ๋ชปํ•˜๋ฉด ์•ฑ์€ ์‹œ์Šคํ…œ์— ์˜ํ•ด ์ค‘๋‹จ๋˜๊ณ  ๋‹ค์Œ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์„ ์œ„ํ•ด ์Šค๋กœํ‹€๋ง์„ ์ผ์œผํ‚ต๋‹ˆ๋‹ค.
โ—ฆ
์ด ๊ฒฝ์šฐ์—๋Š” ๋„คํŠธ์›Œํฌ ์š”์ฒญ์ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๋„คํŠธ์›Œํฌ ์š”์ฒญ์ธ์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
โ—ฆ
๊ทธ๋ ‡๋‹ค๋ฉด ์•ฑ ์ƒˆ๋กœ๊ณ ์นจ ์ž‘์—…์„ ์ฆ‰์‹œ ์™„๋ฃŒํ•˜๊ณ  ๋„คํŠธ์›Œํฌ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ์ถ”๊ฐ€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์‹คํ–‰ ์‹œ๊ฐ„์„ ์œ„ํ•ด์„œ ์•ฑ์„ ๊นจ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
โ€ข
๋ฐฑ๊ทธ๋ผ์šด๋“œ URLSession์ด ์˜ˆ์•ฝ๋˜๋ฉด ๋‹ค์‹œ ์‹œ์Šคํ…œ์€ ์•ฑ์„ ์ผ์‹œ ์ •์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

๊ธฐ๋ณธ ์•ฑ

๋‹ค์Œ ๋‚  ์ •์˜ค์— ์•ฑ์˜ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ƒˆ๋กœ ๊ณ ์นจ์„ ์˜ˆ์•ฝํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑ
1.
๋จผ์ € ๋‚ด์ผ ์ •์˜ค๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋‚ ์งœ๋ฅผ ๋งŒ๋“ฆ
2.
๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์•ฑ์„ ์ƒˆ๋กœ๊ณ ์นจํ•˜๋Š” ์š”์ฒญ์„ ๋งŒ๋“ฆ
3.
๊ฐ€์žฅ ๋น ๋ฅธ ์‹œ๊ฐ„์„ ๋‹ค์Œ ๋‚  ์ •์˜ค๋กœ ์„ค์ •ํ•˜๊ณ  ์Šค์ผ€์ค„๋Ÿฌ์— ์ œ์ถœ
โ˜‘๏ธย ์‹œ์Šคํ…œ์€ ์ด๊ฒƒ์„ ๋ฐ›๊ณ  ๋‹ค์Œ ๋‚  ์ •์˜ค์— ์•ฑ์„ ๊นจ์šฐ๊ฒŒ ๋˜์ฃ .
์˜ˆ์•ฝํ•œ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์— ํ•ด๋‹น ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋“ฑ๋กํ•˜๋ ค๋ฉด ์ƒˆ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—… Scene ์ˆ˜์ •์ž๋ฅผ ์ด์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
โ€ข
์•ฑ์ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์„ ๋ฐ›์œผ๋ฉด ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…๊ณผ ์ผ์น˜ํ•˜๋Š” ์ˆ˜์ •์ž์— ๋“ฑ๋ก๋œ ๋ชจ๋“  ๋ธ”๋ก์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ์—๋Š” appRefresh๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
โ€ข
์›ํ•˜๋Š” ๋‚ ์งœ์— ๋ฐฑ๊ทธ๋ผ์šด๋“œ์˜ ์‹คํ–‰ ์‹œ๊ฐ„์„ ๋ฏธ๋ฆฌ ์˜ˆ์•ฝํ•ด์„œ ์•ฑ์— ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์ฃ  ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—… ์ˆ˜์ •์ž์—์„œ ์š”์ฒญ ๋ฐ ํ•ธ๋“ค๋Ÿฌ์— ๊ฐ™์€ ์‹๋ณ„์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์•ฑ์ด ํ•ด๋‹น ์ž‘์—…์„ ๋ฐ›์„ ๋•Œ ์‹œ์Šคํ…œ์ด ํ˜ธ์ถœํ•  ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
โ€ข
๋‚ด์ผ๋กœ ๋‹ค์‹œ ์˜ˆ์•ฝ์ด ๋๋Š”์ง€ ํ™•์‹คํžˆ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋ฐฉ๊ธˆ ์ž‘์„ฑํ•œ scheduleAppRefresh ํ•จ์ˆ˜๋กœ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์‹คํ–‰ ์‹œ๊ฐ„์„ ๋‚ด์ผ ์ •์˜ค๋กœ ๋‹ค์‹œ ์˜ˆ์•ฝํ•ด์„œ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์„ ์‹œ์ž‘ํ•˜๋ ค ํ•ฉ๋‹ˆ๋‹ค. ์ •์˜ค์˜ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์‹คํ–‰ ์‹œ๊ฐ„์ด ์ˆœํ™˜ํ•˜๋ฏ€๋กœ ๋ฐ”๊นฅ ๋‚ ์”จ๋ฅผ ํ™•์ธํ•˜๋Š” ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ๋งŒ๋“ค๊ณ  Swift์˜ await ํ‚ค์›Œ๋“œ๋กœ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.
โ€ข
ํด๋กœ์ €์˜ ๋ณธ๋ฌธ์ด ๋ฐ˜ํ™˜๋˜๋ฉด ์‹œ์Šคํ…œ์ด ์•ฑ์— ํ• ๋‹นํ•œ ๊ธฐ๋ฐ˜ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์ด ๋ฌต์‹œ์ ์œผ๋กœ ์™„๋ฃŒ๋œ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
โ€ข
์—ฌ๊ธฐ์—์„œ Swift Concurrency๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ž‘์—…์ด ์™„๋ฃŒ๋์„ ๋•Œ ๋ช…์‹œ์ ์ธ ์ฝœ๋ฐฑ ์—†์ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์žฅ๊ธฐ ์‹คํ–‰ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
โ€ข
Apple ํ”Œ๋žซํผ ์ „๋ฐ˜์—์„œ ์•Œ๋ฆผ ์ถ”๊ฐ€๋ฅผ ๋น„๋กฏํ•œ ๋Œ€๋‹ค์ˆ˜ API๋Š” ์ด๋ฏธ ๋น„๋™๊ธฐ ์ž‘์—…์—์„œ Swift Concurrency๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
โ€ข
notifyForPhoto() async ํ•จ์ˆ˜๋ฅผ ํ™œ์šฉํ•˜๋ฉด UserNotificationCenter์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ๋น„๋™๊ธฐ ์•Œ๋ฆผ ์ถ”๊ฐ€ ๋ฉ”์†Œ๋“œ๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Swift concurrency

Swift Concurrency์˜ async์™€ await๊ฐ€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—… ์ฒ˜๋ฆฌ์—์„œ ์šฐ๋ฆฌ์—๊ฒŒ ์–ผ๋งˆ๋‚˜ ํŽธ๋ฆฌํ•œ์ง€ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
๊ทธ๋™์•ˆ ์ฐธ์กฐํ•œ ๋น„๋™๊ธฐ isStormy ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•ด ๋ณด์ฃ !
โ€ข
async ํ•จ์ˆ˜๋Š” ๋ฐ”๊นฅ ๋‚ ์”จ๋ฅผ ํ™•์ธํ•˜๋Š” ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
โ€ข
๊ฐ€์žฅ ๋จผ์ € ๊ณต์œ  URLSession์„ ์“ฐ๊ณ  ๋‚ ์”จ ๋ฐ์ดํ„ฐ ์š”์ฒญ์„ ์ธ์Šคํ„ด์Šคํ™”ํ•ฉ๋‹ˆ๋‹ค.
Swift Concurrency๋ฅผ ์ฑ„ํƒํ•œ URLSession์€ ๋น„๋™๊ธฐ ์ปจํ…์ŠคํŠธ๋กœ ๋Œ€๊ธฐํ•  ์ˆ˜ ์žˆ๋Š” ๋„คํŠธ์›Œํฌ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ–์ท„์Šต๋‹ˆ๋‹ค.
๋„คํŠธ์›Œํฌ ์‘๋‹ต์ด ๋“ค์–ด์˜ค๋ฉด ๋‚ ์”จ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ์‹คํ–‰ ์‹œ๊ฐ„์ด ๋งŒ๋ฃŒ๋˜๊ธฐ ์ „์— ์•ฑ์ด ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ์™„๋ฃŒํ•˜์ง€ ๋ชปํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?
์ด ๊ฒฝ์šฐ์—๋Š” URLSession์„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์„ธ์…˜์œผ๋กœ ์„ค์ •ํ–ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  URLSession ์„ธ์…˜ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์„ ์ด์šฉํ•˜์—ฌ ์•ฑ์— ์‹œ์ž‘ ์ด๋ฒคํŠธ๋ฅผ ๋ณด๋‚ด๋Š”์ง€ ์‚ดํŽด๋ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
โ€ข
Shared URLSession์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
โ€ข
URLSession์„ ๋งŒ๋“ค ๋•Œ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์„ค์ •์—์„œ sessionSendsLaunchEvents ์†์„ฑ์„ true๋กœ ๋†“์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.
โ€ข
์ด ์ฝ”๋“œ๋Š” ์•ฑ์ด ์ผ์‹œ ์ค‘์ง€๋œ ๊ฒฝ์šฐ์—๋„ ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ์‹คํ–‰ํ•˜๊ณ  ์š”์ฒญ์ด ์™„๋ฃŒ๋˜๋ฉด ์•ฑ์„ ๊นจ์›Œ์„œ URLSession ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ผ๊ณ  ์‹œ์Šคํ…œ์— ์•Œ๋ฆฝ๋‹ˆ๋‹ค.
์ด๊ฒƒ์€ watchOS์—์„œ ํŠนํžˆ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.
โ€ข
watchOS ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰๋˜๋Š” ์•ฑ์˜ ๋„คํŠธ์›Œํฌ ์š”์ฒญ์€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ URLSessions์œผ๋กœ ์š”์ฒญ๋ผ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์˜ ์‹คํ–‰ ์‹œ๊ฐ„์ด ๋งŒ๋ฃŒ๋˜๋ฉด ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—… ์ˆ˜์ •์ž์— ์ œ๊ณต๋œ ํด๋กœ์ €๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋น„๋™๊ธฐ ์ž‘์—…์„ ์‹œ์Šคํ…œ์—์„œ ์ทจ์†Œํ•ฉ๋‹ˆ๋‹ค.
โ˜‘๏ธย ์ด๊ฒƒ์€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์‹คํ–‰ ์‹œ๊ฐ„์ด ๋งŒ๋ฃŒ๋  ๋•Œ ์—ฌ๊ธฐ์„œ ์ด๋ค„์ง„ ๋„คํŠธ์›Œํฌ ์š”์ฒญ๋„ ์ทจ์†Œ๋œ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค
์ด ์ทจ์†Œ์— ์‘๋‹ตํ•˜๊ณ  ์ฒ˜๋ฆฌํ•˜๋ ค๋ฉด Swift Concurrency์— ๋‚ด์žฅ๋œ ํ•จ์ˆ˜์ธ withTaskCancellationHandler๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”!
โ€ข
๊ฒฐ๊ณผ๋ฅผ ์ง์ ‘ ๋Œ€๊ธฐํ•˜๊ธฐ๋ณด๋‹ค๋Š” withTaskCancellationHandler ํ˜ธ์ถœ์— ๋‹ค์šด๋กœ๋“œ๋ฅผ ๋„ฃ๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋„ ํ•จ๊ป˜ ๋Œ€๊ธฐํ•˜์„ธ์š”.
โ€ข
withTaskCancellationHandler์— ์ „๋‹ฌ๋œ ์ฒซ ๋ฒˆ์งธ ๋ธ”๋ก - ์šฐ๋ฆฌ๊ฐ€ ์‹คํ–‰ํ•˜๋ ค๊ณ  ๋Œ€๊ธฐํ•˜๋Š” ๋น„๋™๊ธฐ ํ”„๋กœ์‹œ์ €
โ€ข
๋‘ ๋ฒˆ์งธ ํ›„ํ–‰ ํด๋กœ์ € - ์ž‘์—…์ด ์ทจ์†Œ๋  ๋•Œ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ
โ—ฆ
์—ฌ๊ธฐ์—์„œ ์ฆ‰๊ฐ์ ์ธ ๋„คํŠธ์›Œํฌ ์š”์ฒญ์ด ์‹คํ–‰ ์‹œ๊ฐ„ ๋งŒ๋ฃŒ๋กœ ์ทจ์†Œ๋˜๋ฉด ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๋‹ค์šด๋กœ๋“œ ์ž‘์—…์œผ๋กœ ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ์Šน๊ฒฉํ•˜์—ฌ ์žฌ๊ฐœ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
โ—ฆ
์•ฑ์ด ์ผ์‹œ ์ •์ง€๋œ ์ƒํƒœ์—์„œ๋„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๋‹ค์šด๋กœ๋“œ๋ฅผ ๊ณ„์† ์ง„ํ–‰
โ˜‘๏ธย ์ด ์ฝ”๋“œ๋Š” ์–‘์ชฝ ๋ชจ๋‘ ๊ฐ™์€ URLSession์„ ์‚ฌ์šฉํ•ด์„œ ๊ธฐ๋ฐ˜ ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ๋‘ ๋ฒˆ ๋ณด๋‚ด์ง€ ์•Š์œผ๋ฉฐ URLSession์€ ์ง„ํ–‰ ์ค‘์ธ ๋ชจ๋“  ์ค‘๋ณต ์š”์ฒญ์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
์šฐ๋ฆฌ๊ฐ€ ์กฐ๊ธˆ ์ „์— ๋งŒ๋“  ๋ฐฑ๊ทธ๋ผ์šด๋“œ URLSession๊ณผ ๋™์ผํ•œ ์‹๋ณ„์ž๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํŠน์ • URLSession์ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์„ ์ƒ์„ฑํ•  ๋•Œ๋งŒ ์ด ๋ธ”๋ก์ด ํ˜ธ์ถœ๋˜๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.