iOS๊ฐ๋ฐ์ ์จ๋ฐ์
๋๋ค.
https://www.youtube.com/@allen_ios
์ ๊ฐ ๊ณต๋ถํ๋ฉด์ ๊ฒช์๋ ์ํ์ฐฉ์ค๋ฅผ ์ฝ๊ฒ ํ์ด๋ด์ด 
์ง์์ ๊ณต์ ํ  ์์๋ ๊ฐ๋ฐ์๊ฐ ๋๊ณ ์ถ์ต๋๋ค.
์ฌ์ด ์ฃผ์ ๋ก ๋น ๋ฅธ ์๊ฐ ์์ ๊ฒํฅ๊ธฐ ์์ผ๋ก ์ฝ๊ฒ๋ง ๊ฐ๋ฅด์น๋ ๊ฐ์๋ฅผ ๋ง๋๋ ๊ฒ์๋ ๊ด์ฌ์ด ์์ต๋๋ค. 
๊ทธ๋ฐ ๊ฐ์๋ ์ผ๋ง๋ ์ง ๋น ๋ฅด๊ฒ ์ฐ์ด๋ด๋ฏ ๋ง๋ค ์ ์๊ฒ ์ง๋ง, ๊ฒฐ๊ตญ "์ข์ ๊ฐ๋ฐ์๋ก ์ฑ์ฅ"ํ๋ ๊ฒ์ ๊ทธ๋งํผ ์ด๋ก ์ ์ธ ๊ธฐ๋ฐ์ ๋ฐ๊ฑฐ๋ฆ์ด ํํํด์ผ ํ๋ค๊ณ  ๋ฏฟ๊ณ  ์๊ธฐ ๋๋ฌธ์
๋๋ค. 
์ฌ์ด ๊ฐ์๋ณด๋ค๋, ์ข์ ๊ฐ๋ฐ์(๋์์์ด ์ฑ์ฅํ  ์ ์๋ ๊ฐ๋ฐ์)๊ฐ ๋๊ธฐ ์ํด
๋ฐ๋์ ์์์ผ ํ๋ ์ด๋ ค์ด ๋ด์ฉ๊น์ง๋ฅผ ์ต๋ํ ์ฝ๊ฒ, ๊ทธ๋ฆฌ๊ณ  ์ง๊ด์ ์ผ๋ก ์๋ ค๋๋ฆฌ๋ ๊ฒ.
๊ทธ๋์ ์ ๊ฐ ์๋ ์ฌ๋ฌ๋ถ ์ค์ค๋ก ๊ณ ๋ฏผ/์๊ฐํ  ์ ์๋ ๋ฐ๊ฑฐ๋ฆ์ ๋ง๋ค์ด ๋๋ฆฌ๋ ๊ฒ์ ์ ์ ๊ฐ์ ๋ชฉํ๋ก ์ผ๊ณ  ์์ต๋๋ค.
์  ์ค์ค๋ก๋ ๋ด์ผ์ ๋ ์ข์ ๊ฐ๋ฐ์๊ฐ ๋์๋ ๋ชจํ ๋ฅผ ๊ฐ์ง๊ณ  ์๋ ๋งํผ
์ ๊ฐ ๊ณ ๋ฏผ ํ๋ ๋ด์ฉ๋ค์ ๊น์ด์๊ฒ ์ ๋ฌ ๋๋ฆฌ๊ณ  ์ถ์ต๋๋ค.
๐๐ป๋ฌธ์๋ ์๋์ ์ด๋ฉ์ผ๋ก ์ฃผ์๋ฉด ๋ฉ๋๋ค. 
we.love.code.allen@gmail.com
์ธ์ด: Swift(์ค์ํํธ), Python, Java, C#
Courses
Reviews
- Alan Swift Concurrency for Swift 6 (Part-1)
- Alan Swift Concurrency for Swift 6 (Part-1)
- Alan Swift Concurrency for Swift 6 (Part-2)
- Alan Swift Concurrency for Swift 6 (Part-1)
- Alan Swift Concurrency for Swift 6 (Part-1)
Posts
- Q&A - Task ํด๋ก์  ๋ด `non-Sendable` ๊ฐ ํ์ ์ ๊ทผ ์, ์บก์ฒ ๋ฆฌ์คํธ๊ฐ ์ ์๋ Task ์์์ ๋ฐ๋ฅธ ์ปดํ์ผ๋ฌ ์๋ฌ ์ฐจ์ด - ์๋ ํ์ธ์! sujinnaljin ๋!์ง๋ฌธ์ฃผ์ ๋ด์ฉ์ดํ์ฌ ๊ฐ์์ 48๊ฐ ~ 52๊ฐ ๋ด์ฉํ๊ณ ๊ด๋ จ๋ ๋ด์ฉ์ธ๋ฐ, ์ด๋ฒ์ Xcode๊ฐ ์ ๋ฐ์ดํธ๊ฐ ๋๋ฉด์ ๋ด๋ถ ๋ฉ์ปค๋์ฆ์ด ์ด๋ฒ์ ์ ๋๋ก ๊ตฌํ์ด ๋์๋ ๋ณด๋ค์.(Region Based Isolation ๊ด๋ จ ๋ด์ฉ์ด์์, https://github.com/swiftlang/swift-evolution/blob/main/proposals/0414-region-based-isolation.md )๋ค์ ๊ฐ์์์ ๋ด์ฉ์ ์์ธํ ๋ค๋ฃจ๊ณ ์์ผ๋.. ๊ฐ์ ๋ด์ฉ์ ๋ณด์๋ฉด ๋๊ณ , ๊ทธ ์ ์ ์ต๋ํ ์ง๊ด์ ์ด๊ณ ๊ฐ๋จํ๊ฒ๋ง ๋ง์๋๋ ค๋ณด๋ฉด, ValueCounterํ์ ์ ๊ฐํ์ ์ด๊ธด ํ์ง๋ง, Task์ ํด๋ก์  ์์ฒด๋ ๋ณ์ ์ฃผ์๋ฅผ ์บก์ฒํด์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ valueCounter ๋ณ์ ์ฃผ์๊ฐ ํ๋ฒ ์ ๋ฌ(sending)์ด ๋์ด ๋ฒ๋ฆฌ๋ฉด, ๊ทธ ์ดํ์ ์ฝ๋์์๋ ์ฌ์ฉํ ์๊ฐ ์์ต๋๋ค. (๊ทธ๊ฒ Swift Concurrency์์ ์๋กญ๊ฒ ๋์ ํ Shared Mutable State๋ฅผ ๋ค๋ฃจ๊ธฐ ์ํ ๋ด๋ถ ๋ฉ์ปค๋์ฆ์ด๋ผ๊ณ ๋ณด์๋ฉด ๋ฉ๋๋ค.)(์ฆ, ์์ Task๋ฅผ "1๋ฒ Task"๋ผ๊ณ ์ด๋ฆ ๋ถ์ด๊ธฐ๋ก ํ๊ณ , ์๋ Task๋ฅผ "2๋ฒ Task"๋ผ๊ณ ์ด๋ฆ ๋ถ์ด๊ธฐ๋ก ํ๋ฉด.. ์ด๋ฏธ 1๋ฒ Task์์ valueCounter๋ฅผ ์ฐจ์งํ๊ณ ์จ๋ฒ๋ฆฌ๊ธฐ๋ก ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ 2๋ฒ Task์์๋ ๋์ด์ valueCounter์ ๋ณ์์ ์กฐ์ฐจ ์ ๊ทผํ ์ ์์ด์ง ๊ฒ์ ๋๋ค.)func test() { var valueCounter = ValueCounter() โ Task {// valueCounter์ ์ฃผ์๊ฐ Task ๋ด๋ถ๋ก ์์  ์ ๋ฌ (๋์ด์ ์๋ ์ฝ๋์์ ์ฌ์ฉ ๋ถ๊ฐ) print(valueCounter.increment()) print(valueCounter.value) } Task { [valueCounter] in // valueCounter ์ฃผ์์ ์ ๊ทผ ๋ถ๊ฐ var newValueCounter = valueCounter print(newValueCounter.increment()) print(newValueCounter.value) } }๋ค๋ง, Task์ ์บก์ฒ๋ฆฌ์คํธ ์์๊ฐ ๋ฐ๋๋ฉด ๊ฐ๋ฅํ ๊ฒ์ ๋๋ค. ์๋๋ฉด ์ด๋ฒ์๋ ์บก์ฒ๋ฆฌ์คํธ๋ฅผ ๋จผ์  ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์, valueCounter๋ณ์์ ์ฃผ์๊ฐ Task ๋ด๋ถ๋ก ์์  ์ ๋ฌ(sending)์ด ๋ ๊ฒ์ด ์๋๊ธฐ ๋๋ฌธ์.. ๊ทธ ์ดํ์ ์ฝ๋์ธ Task์์ valueCounter ๋ณ์์ ์ ๊ทผ์ด ๊ฐ๋ฅํ ๊ฒ์ ๋๋ค.func test() { var valueCounter = ValueCounter() โ Task { [valueCounter] in // valueCounter ์ฃผ์๊ฐ ์์  ์ ๋ฌ์ด ๋ ๊ฒ์ด ์๋ var newValueCounter = valueCounter print(newValueCounter.increment()) print(newValueCounter.value) } Task {// valueCounter ์ฃผ์์ ์ ๊ทผ ๊ฐ๋ฅ print(valueCounter.increment()) print(valueCounter.value) } } ๋ค, ๊ทธ๋์ ์์ ๊ฐ์ ๋ด์ฉ์ ํ์ธํ์๋ฉด ๋ ๊ฒ ๊ฐ๊ณ ..๊ฐ์ ํ๋ฐ๋ถ 48๊ฐ ~ 52๊ฐ ๋ด์ฉ๊ณผ sendingํค์๋ ๋ด์ฉ๊น์ง๋ฅผ ์ ๋ณด์๋ฉด ์ง๋ฌธ ์ฃผ์ จ๋ ๋ด์ฉ์ ๋ํด ๋ช ํํ๊ฒ ์ดํดํ์ค ์ ์์ผ์ค ๊ฒ ๊ฐ์ต๋๋ค.(์ ๊ฐ ๊ฐ์ ์ดฌ์ ๋น์์๋.. ์ปดํ์ผ๋ฌ ๋ด๋ถ์ sendingํค์๋ ๊ด๋ จ ๋ถ๋ถ์ด ์๋ง ์ ํํ๊ฒ ๊ตฌํ์ด ์๋์ด ์์ด ํฌ๋์๊ฐ ๋์ง ์์๋๋ฐ, ์ ํํ๊ฒ ๋ง์๋๋ฆฌ๋ฉด ํด๋น 12๊ฐ ๊ฐ์ ๋ด์ฉ ์ค์ ์บก์ฒ๋ฆฌ์คํธ ๋ถ๋ถ์ ๋ํด ์ค๋ช ๋๋ฆฌ๋ ๋ด์ฉ์ ์ ํํ๊ฒ ์ปดํ์ผ๋ฌ ์ ๋ฐ์ดํธ๊ฐ ๋๊ธฐ ์  ๋ด์ฉ์ด๋ผ, ์ ๋๋ก ๋์ํ๊ณ ์์ง ์์ ๊ฒ์ผ๋ก ๋ณด์๋ฉด ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ฆ, ์ง๊ธ ์ค๋ช ๋๋ฆฐ ๋ด์ฉ์ด Evolution๋ฌธ์์ ์ ํํ๊ฒ ์ผ์นํ๊ฒ ์ปดํ์ผ๋ฌ๊ฐ ์ ๋ฐ์ดํธ ๋ ๋ด์ฉ์ด๋ผ๊ณ ๋ณด์๋ฉด ๋ฉ๋๋ค.) ๋ง์๋๋ฆฐ ๊ฐ์ ํ๋ฐ๋ถ ๋ด์ฉ ํ์ธํด๋ณด์๊ณ ๋ ์ดํด๊ฐ ์๋์๋ ๋ถ๋ถ์ด ์์ผ์๋ฉด ๋ค์ ์ง๋ฌธ์ฃผ์ธ์ ! ๊ฐ์ฌํฉ๋๋ค. :) - 0
- 1
- 40
 
- Q&A - 18๊ฐ NSCache ์์ ์ง๋ฌธ - ๋ค, sujinnaljin ๋์ฒซ๋ฒ์งธ ์ง๋ฌธ)์, ๋ค๋ค ๋จ์ ์์๋ผ์ ์ ๊ฐ ๊ผผ๊ผผํ๊ฒ ์์ฑํ์ง๋ ์์์๋ค์! ๋ง์ํ์ ๋๋ก ์ ํํ๊ฒ ์์ฑํ์ ๋ค๋ฉด.. ์๋์ ๊ฐ์ ํํ๋ก ์์ฑํ์๋ ๊ฒ์ด ๋น์ฐํ ๋ง์ต๋๋ค. (์ญ์ ๋ ๋์ ๋๋ฆฌ์ ์ ๊ทผํ๋ ๊ฒ์ด๋๊น์.)func clearAll() { lock.lock() cache.removeAll() lock.unlock() } ๋๋ฒ์งธ ์ง๋ฌธ)์ ๋ค, NSCache ์์ฒด๋ ๋ด๋ถ์ ์ผ๋ก ์ผ๋จ Thread-safeํ๊ธฐ ๋๋ฌธ์ @unchecked Sendable ๋ง ์ฌ์ฉํ์ ๋ ๋ฉ๋๋ค. (์๋์ ๊ฐ์ ์ฒ๋ฆฌ๋ฅผ ์ํด๋ ๋๋ค๋ ๊ฒ์ด๊ฒ ์ฃ .)func setValue(_ value: Value, for key: Key) { semaphore.wait() cache[key] = value semaphore.signal() }func setValue(_ value: Value, for key: Key) { lock.lock() cache[key] = value lock.unlock() } ๊ทธ๋ฆฌ๊ณ .. ์ผ๋จ ๊ณต์๋ฌธ์์ Thread-safeํ๋ค๊ณ ๋์์์ผ๋, (์ ๋ผ๋ฉด) ์๋์ฒ๋ผ ๊ทธ๋ฅ ์ง์ ์ ์ผ๋ก ์ฌ์ฉํ ๊ฒ ๊ฐ๊ณ ..func setValue(_ value: Value, for key: Key) { cache[key] = value }๋ง์ฝ์ ๊ทธ ์ ์ (1) NSCache๋ฅผ ์ฌ์ฉํด๋ณธ ์ ์ด ์๊ฑฐ๋, (2) ๊ณต์๋ฌธ์๋ฅผ ๋ฏธ๋ฆฌ ํ์ธํ์ง ์์๋ค๋ ๊ฐ์ ์ ํด๋ณด๋ฉด, ๋น์ฐํ @unchecked Sendable + ์์ ํ๊ฒ ์(semaphore or lock)์ ๊ฐ์ ์ฒ๋ฆฌ๋ฅผ ์ฌ์ฉํ ๊ฒ ๊ฐ์ต๋๋ค. (๋ฌผ๋ก ์๋ฅผ ๋ค์ด, ์์ ๊ฐ์ ๋ฉ์๋ ๋ก์ง์์ NSCache๋ง ์ฌ์ฉํ๋ ๊ฒ์ด ์๋๋ผ, ๋ค๋ฅธ ๋์ ๋๋ฆฌ ๋ฑ๋ ์์ฑ์ผ๋ก ๊ฐ์ด ์ฒ๋ฆฌํด์ฃผ๋ ๋ฑ์ด ์๋ค๋ฉด, ์๋ฌด๋ฆฌ NSCache๋ฅผ ์ฌ์ฉํ๋ค๋๋ผ๋, semaphore ๋ lock ์ ์ฌ์ฉํด์ผ๊ฒ ์ง๋ง์.)๋ต๋ณ์ด ๋์ จ์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค. :) ๊ฐ์ฌํฉ๋๋ค...! - 0
- 2
- 32
 
- Q&A - Task ์ default ์ฐ์ ์์ ๋ฌธ์ (utility vs medium) - ๋ค, sujinnaljin ๋ ๊ฐ์ ๋ด์ฉ์์๋ ๋ง์๋๋ฆฌ๊ณ ์์ง๋ง.. ํฌ๊ฒ ์ค์ํ ๋ด์ฉ์ ์๋ ๊ฒ ๊ฐ์์.. ^^; ์ ๊ฐ ๊ตณ์ด ๋ค์ ์ฐพ์๋ณด์ง๋ ์์์๋ค์. Task ์ default ์ฐ์ ์์๊ฐ medium ์ธ ๊ฒ์ด ๋ง์ต๋๋ค. (์ ๊ฐ ์๊ธฐ๋ก๋ Swift๋ฒ์ ์ด ์ ๋ฐ์ดํธ ๋๋ฉด์ ์ค๊ฐ์ ๋ฐ๋ ๊ฒ ๊ฐ๋ค์. ์ด๋ฐ์ ์๋ฃ๋ฅผ ๋ง๋ค๊ธฐ ์์ํ ๋๋ utility ์๋ ๊ฒ์ผ๋ก ๊ธฐ์ตํ๊ณ ์์ด์์.) ๋ถํธ์ ๋๋ ธ๋ค๋ฉด ์ฃ์กํฉ๋๋ค. ๊ฐ์๋.. ์ ๋ฐ์ ์ธ ๋ด์ฉ ํฐํ์ ์ดํดํ์๋ ๋ฐ๋ ๋์์ด ๋์ค ์ ์์ผ๋, ์์ฃผ ๋ํ ์ผํ ๋ด์ฉ์์๋ ์ง์  ๊ณต์๋ฌธ์ ๋ฑ์ ํตํด์ ์ฐพ์๋ณด์ ๋ด์ฉ์ด ๋น์ฐํ ์ฐ์ ์ ๋๋ฆฌ๋ผ๊ณ ์๊ฐ๋ฉ๋๋ค. ๊ฐ์ฌํฉ๋๋ค :) - 0
- 2
- 23
 
- Q&A - 18๊ฐ ์์ ์์ ์ ๋ฉํ๋ฐ์ดํฐ ์์ ๊ด๋ จ ๊ฐ์ ์๋ฃ ๋ฌธ์ - ์ ๋ค, ํฐ ์๋ฏธ๊ฐ ์๋ ๊ฒ์ ์๋๊ณ ๊ทธ๋ฅ ๋จ์ํ๊ฒ ๋๊ฐ์ง ์๋ฏธ ๋๋ฌธ์ ์ทจ์์ ์ผ๋ก ํ์ํด ๋์ ๊ฒ์ด๊ธฐ๋ ํ๋ฐ,"๋ฉํ๋ฐ์ดํฐ"๋ผ๋ ๊ฒ์๋ (1) ์ฒซ๋ฒ์งธ๋ก๋ ํ์ฌ ์คํ ์ค์ธ ์กํฐ๊ฐ ์์ ์๋ ์๊ณ ์๋ ์๋ ์์ด์ ์ทจ์์ ์ผ๋ก ํ์ํด๋์ ๊ฒ ์ ๋๋ค. ์ฆ, ๊ตฌ์กฐ์  ๋์์ฑ์ด ์กํฐ ๋ด๋ถ์์ ์คํํ๋ ๊ฒฝ์ฐ - ์กํฐ ์์ํ๊ฒ ๋๊ณ , ์กํฐ ๋ด๋ถ๊ฐ ์๋ ๊ณณ์์ ์คํํ๋ ๊ฒฝ์ฐ - ์์ํ ์กํฐ๊ฐ ์์ด์... ์์ํ ์กํฐ๊ฐ ์๋ ๊ฒฝ์ฐ/์๋ ๊ฒฝ์ฐ ๋๋ฌธ์ ๊ทธ๋ ์ต๋๋ค.(2) (๋ค๋ฅธ ์ธก๋ฉด์์๋) ๊ตฌ์กฐ์  ๋์์ฑ ์์ฒด๊ฐ ๋ณ๋ ฌ์ฒ๋ฆฌ๋ฅผ ๋ชฉ์ ์ผ๋ก ํ๋ ๊ฒ์ด๋ผ.. ๋ถ๋ชจ ์์ ์ ๊ฒฝ์ฐ๋ ์กํฐ์์ ์คํ๋ ์ ์์ง๋ง, ํ์(์์) ์์ ๋ค์ ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌ๋์ด (์กํฐ์ ์๊ด์์ด) ์คํ๋๊ธฐ ๋๋ฌธ์ ๊ทธ๋ฐ ์๋ฏธ์์ ์ด์ง(?) ํ์๋ฅผ ํด๋ ๊ฒ์ด๊ธด ํฉ๋๋ค. ๊ฐ์ฌํฉ๋๋ค. :) - 0
- 1
- 20
 
- Q&A - withCheckedContinuation ์์ resume ํธ์ถ์ ์์ ์ฑ ๋ณด์ฅ ์ง๋ฌธ - ์ ๋ค๋ค, sujinnaljin ๋.๊ฐ์ ๋ด์ฉ์ด ์๋ชป๋ ๊ฒ ๊ฐ๋ค์! ๊ณต์ ๋ฌธ์ ๋ด์ฉ์ ์ ๋ ๋ค์ ํ์ธํด๋ณด๋, ํด๋น ๋ถ๋ถ์ ๋ํ ๋ด์ฉ์ ์ ๊ฐ ์์ธํ๊ฒ ์ฒดํฌํ์ง ๋ชปํ ๋ถ๋ถ์ด ์๋ค์! ๋ง์ํ์ ๋ด์ฉ์ด ๋ง์ต๋๋ค ^^;(์๋ง ์ ๋ ์ด๋ฐ ํ์ต ํ ๋์ ๋ด์ฉ์ ๋ํด ์ถํ์ ์์ธํ๊ฒ ์ดํด๋ณด์ง ์์์ ๋๋ธ ์ฒดํฌ๋ฅผ ๋ชปํ๋ ๋ถ๋ถ์ด๋ค์.) ๊ฐ์ ๋ด์ฉ, ๊ต์ฌ ๋ด์ฉ๋ ์์ ํด ๋์์ผ ๊ฒ ๋ค์!์๋ ค์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค :) - 0
- 1
- 33
 
- Q&A - ์ฐธ๊ณ ์ฝ๋ ์๋ฃ 7-StructuredConcurrency(102, 103์ค) ์คํ? - ์, ๋ค ๋ง๋ค์ใ ใ ์คํ๊ฐ ์์๋ค์! ๋ค A์ฝ๋์ ํํ๋ ์๋ชป๋์๊ณ , (์๋์ ๊ฐ์) ์ฌ์ฉํ์ B์ ํํ๊ฐ ์ ํํ ๋ง์ต๋๋ค.(์๋ฃ๋ ์์ ํด ๋๊ฒ ์ต๋๋ค.) /// ๊ตฌ์กฐ์  ๋์์ฑ ์์ ์ ์์ฑ (ํ์ ์์ ์ ์์ฑ) async let image1 = fetchImage(num: 1) async let image2 = fetchImage(num: 2)์ง๋ฌธ์ ์ ํํ ๋ต๋ณ์ ๋๋ฆฌ๊ณ ์ถ์ง๋ง..์  ์๊ฐ์๋ ์๋ชป๋ ์ฝ๋๋ฅผ ๋ถ์ํ๋ค๋๊ฒ ํฌ๊ฒ ์๋ฏธ๊ฐ ์์ ๊ฒ ๊ฐ์ต๋๋ค..ใ ใ ์ด์ฐจํผ A์ฝ๋์ ๊ฐ์ ํํ๋ก ์ฌ์ฉํ๋ ๊ฒ์ด ์๋๋ผ, ์๋ชป๋ ์ฝ๋์ผ๋ฟ์ธ ๊ฒ์ด์ฃ . (์๋ชป๋ ์ฝ๋์ธ๋ฐ, ์์ฒด์ ์ผ๋ก ์ปดํ์ผ๋ฌ๊ฐ ์ค๋ฅ๋ฅผ ์ก์์ฃผ์ง ์๋ ๊ฒ์ผ๋ฟ์ด๋ผ๊ณ ๋ณด์๋ฉด ๋ ๊ฒ ๊ฐ์ต๋๋ค.) ๊ทธ๋ฅ ๋จ์ํ, ์ง์ง ์  ๊ฐ์ธ์ ์ธ ๋ํผ์ ๋ก๋ ๋ด๋ถ์ ์ผ๋ก B์ฝ๋์ ์์ ํ ๋์ผํ๊ฒ ๋์ํ ๊ฒ ๊ฐ๊ธดํฉ๋๋ค. /// ๊ตฌ์กฐ์  ๋์์ฑ ์์ ์ ์์ฑ (ํ์ ์์ ์ ์์ฑ) async let image1 = try await fetchImage(num: 1) async let image2 = try await fetchImage(num: 2)์๋๋ฉด, ์์ ๊ฐ์ ์ฝ๋์์ ์ปดํ์ผ ๋ ๋, ์ผ์ชฝ์ ์ฝ๋์ธ.. async let์ ์ฝ๋๋ฅผ ๋จผ์  ์ปดํ์ผ ์ํฌ ๊ฒ์ด๊ธฐ ๋๋ฌธ์, ์ค์  async let image1 ์ฝ๋์์ ์ผ๋จ ๋น๋๊ธฐ ํจ์๋ฅผ ํธ์ถ ์ํค๊ณ ๋ค์ ์ค์ ์ฝ๋๋ก ๋์ด๊ฐ๋ ๋์์ผ๋ก async let image2๋ฅผ ์ปดํ์ผ ์ํฌ ๊ฒ ๊ฐ์ต๋๋ค.(๋ค๋ง, ์ธก์ ํ์ ์๊ฐ์ด ๋ค๋ฅด๊ฒ ๋์จ ์ด์ ๋ ์ ๋ง ๋จ์ํ๊ฒ ํ๋ ์ด๊ทธ๋ผ์ด๋ ์คํ ํ๊ฒฝ์ ๋ฌธ์ ์ด์ง ์์๊น ์ถ์ต๋๋ค. ์๋ฐฑ๋ฒ์ ์คํ์ ํด๋ณด๋ฉด ์ผ์ถ ๋น์ทํ๊ฒ ๋์ฌ ๊ฒ ๊ฐ์ต๋๋ค.) ์ฝ๋ ๋ด์ฉ์ ์ฃผ์ ๊น๊ฒ ๋ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. :) - 0
- 3
- 35
 
- Q&A - ๊ธฐ์ด ์ฑ 4๊ฐ Type Any -> UIButton - ๋ค ๊ธฐ์ฐ ๋.๋ํ ์ผํ๊ฒ ์ ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค ๐ Anyํ์ ์ ์ถ์์ ์ธ ํ์ ์ด๊ธฐ ๋๋ฌธ์, ๋ง์ฝ ๊ตฌ์ฒด์ ์ธ ํ์ ์ธ UIButton์ผ๋ก ์ง์  ์ง์ ํด์ ์ฌ์ฉํ์ง ์๋ ๊ฒฝ์ฐ๋ ํ์ ์บ์คํ ์ ํด์ UIButton๋ค์ ์์ฑ์ ์ ๊ทผํ ์ ์๊ณ ,์ง์  UIButton์ ์ค์ ํ๋ ๊ฒฝ์ฐ, ๊ตณ์ด ํ์ ์บ์คํ ์ ํ์ง ์์๋ ๋๋.. ์กฐ๊ธ ๋ ํธํ๊ฒ ์ฌ์ฉํ์ค ์ ์์ต๋๋ค. :) - 0
- 2
- 34
 
- Q&A - 3๊ฐ ์ค๋ ๋ ์ ์ด๊ถ ๊ด๋ฆฌ ์ง๋ฌธ๋๋ฆฝ๋๋ค - ๋ค ์๋ ํ์ธ์ ๋ฏธ๋ฝ ๋!1. ๋ค ๋ง์ต๋๋ค. ์ฌ๊ฐ(resume)๋ฅผ ํ๊ฒ ๋๋ฉด, ์๋ณดํ๋ ์ฐ๋ ๋ ์ ์ด๊ถ์ ๋ค์ ๋๋ ค๋ฐ์ ์ผ์ฒ๋ฆฌ๋ฅผ ํ๊ฒ ๋ฉ๋๋ค. (์ฐ๋ ๋ ์ ์ด๊ถ์ด๋ ๊ฒ์, "์ง๊ธ ์คํ๋๋ ํจ์"๊ฐ ๊ฐ์ง๊ณ ์์ ์ ๋ฐ์ ์๋ค๊ณ ๋ณด์๋ฉด ๋ฉ๋๋ค. ์๋๋ฉด.. ์ฐ๋ ๋ ์ ์ด๊ถ์ ์ฝ๊ฒ ๋งํ์๋ฉด, "CPU๋ฅผ ๋ด๊ฐ ์ฐจ์งํ๊ณ ์ฌ์ฉํ ๊ป"์ ๊ทธ ๋ด๋ถ ์ปจํธ๋กค์ ๊ด๋ฆฌํ๋ ๊ฐ๋ ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ทธ๋ฌ๋๊น, ์ฌ๊ธฐ์ func2๋ ๋ค์ ์ฐ๋ ๋ ์ ์ด๊ถ์ ๋๋ ค๋ฐ์์, ํจ์๋ฅผ ์ฌ๊ฐ์ํจ ๊ฒ์ด๋ค๋ผ๋ ์๋ฏธ๋ก ์ค๋ช ๋๋ฆฌ๊ณ ์๋ ๊ฒ์ ๋๋ค.)2. ๋ค ๋ง์ต๋๋ค. func1์์ func2๋ฅผ ํธ์ถํ ์ํฉ์ด๋ผ๊ณ ๊ฐ์ ํ๊ณ ์ค๋ช ๋๋ ธ๊ณ , (func2๊ฐ CPU๋ฅผ ์ฐจ์งํ๊ณ ์ฌ์ฉํ๋ค๊ฐ) func2๊ฐ ์ผ์ฒ๋ฆฌ๊ฐ ๋ค ๋๋์ ๋ฆฌํดํ๊ฒ ๋๋ฉด ("func1์, ์ด์  CPU ๋๊ฐ ์ฐจ์งํ๊ณ ์ฌ์ฉํด๋ ๋ผ"..์ด๋ฐ ๊ฒ์ฒ๋ผ) ์ฐ๋ ๋ ์ ์ด๊ถ์ ์ด์  func1์ ๋๊ธฐ๊ฒ ๋ฉ๋๋ค.3. ๋ค ๋ง์ต๋๋ค. func1 (Caller)์์ func2 (Callee)๋ฅผ ํธ์ถํ๊ฒ ๋๋ฉด, func1์ด ๊ฐ์ง๊ณ ์๋ ์ฐ๋ ๋ ์ ์ด๊ถ์ func2์๊ฒ ๋๊ฒผ๋ค๊ฐ ์คํ์ด ๋ค ๋๋๋ฉด func1์ด ๋๋ ค๋ฐ๊ฒ ๋๋๋ฐ, ์ด ๊ฐ๋ ์ GCD๋ Swift Concurrency๋ ๋์ผํฉ๋๋ค. ๋ค๋ง, ์ฐจ์ด๋.. GCD์์๋ (func2์ ์ฅ์์ ๋ณด๋ฉด) func2๋ ์ฐ๋ ๋ ์ ์ด๊ถ์ ์ด์์ฒด์ ์๊ฒ ์๋ณดํ ์ ์๋ ๊ฐ๋ ์ด ์๋๋ฐ, (๊ทธ๋์ func2๋ ํ๋ฒ ์ผ์ ์์ํ๋ฉด ๋ฌด์กฐ๊ฑด ๋๋ ๋๊น์ง ๋์ํ ์ ๋ฐ์ ์๋๋ฐ)Swift Concurrency๋ func2๊ฐ ์ด์์ฒด์ ์๊ฒ ์ ๊น ์ฐ๋ ๋ ์ ์ด๊ถ์ ์๋ณดํด์, (์ค๊ฐ์) ์ด์์ฒด์ ๊ฐ ๋ค๋ฅธ ์ผ์ฒ๋ฆฌ๋ฅผ ํด๋ ๋ ์ ์๊ฒ ๋๋ ๊ฐ๋ ์ ๋๋ค. (์ด์์ฒด์ ๋ ๊ทธ ์๋ณด ๋ฐ์ ์ฐ๋ ๋ ์ ์ด๊ถ์ ๋ ๋ค๋ฅธ ์ด๋ค ํจ์์๊ฒ ์ ๊น ๋น๋ ค์ค์ ์ผ์ ์ํค๊ฒ ์ฃ .)4๊ฐ์์ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ์ ์ผ๋ก ์ด๋ป๊ฒ ํจ์๊ฐ ์ ๊น ๋ฉ์ท๋ค๊ฐ ์คํ๋ ์ ์๋์ง์ ๋ด์ฉ์ ์ฐธ๊ณ ํ์ ์ ์๊ฐํด ๋ณด์๋ฉด ๋ง์ ๋์์ด ๋์ค๊บผ์์! ์ดํด๊ฐ ์๋์๋ ๋ถ๋ถ์ด ์์ผ์๋ฉด ์ถ๊ฐ์ ์ผ๋ก ์ง๋ฌธ์ฃผ์ธ์ :) ๊ฐ์ฌํฉ๋๋ค. :) - 0
- 1
- 44
 
- Q&A - 10๋ฒ ๊ฐ์ ๊ด๋ จํ์ฌ ์ง๋ฌธ๋๋ฆฝ๋๋ค. - ๋ค ์๋ ํ์ธ์ ๊ฐ๋ฐ์ ๋. ๋ค ๋ง์ต๋๋ค. ์๋ฐํ๊ฒ ๋ฐ์ ธ๋ณด๋ฉด, ๊ฐ๋ฐ์ ๋์ด ๋ง์ํ์ ๊ฒ ๋ง์ต๋๋ค. ์  ๊ต์ฌ 29 ํ์ด์ง์๋ ๋ณด์๋ฉด, ํจ์๊ฐ ์ฌ๊ฐ๊ฐ ๋ ๋๋ ๋ค๋ฅธ ์ฐ๋ ๋์์ ์ฌ๊ฐ๊ฐ ๋ ์ ์๋ค๊ณ ๊ทธ๋ฆผ๊น์ง ๊ทธ๋ ค์ ์ค๋ช ๋๋ฆฌ๊ณ ์๊ธฐ๋ ํ๊ณ ์. ๋ค๋ง, ์ฌ๊ธฐ์ ๊ทธ๋ ๊ฒ ์ค๋ช ๋๋ฆฌ๋ฉด, ์ดํดํ ์ ์์ ์ ๋๋ก ์์ฒญ ๋ณต์กํด ์ง์ง ์์๊น์? ๊ทธ๋์ ํด๋น ์ค๋ช ๋๋ฆฌ๊ณ ์๋ ๋ถ๋ถ์์๋ Task ์์ฒด๊ฐ ํน์ ํ ์ฐ๋ ๋์์๋ง ์คํ๋๋ค๊ณ ๊ฐ์ ์ ํด์ผ, ์ด๋ก ์ ์ผ๋ก ์ดํดํ๋ ์ธก๋ฉด์์ ํจ์ฌ "์ง๊ด์ ์ผ๋ก" ์ดํด๊ฐ ์ฌ์์ง๊ธฐ ๋๋ฌธ์, ๊ทธ๋ ๊ฒ ๊ฐ์ ํ๊ณ ๋ง์๋๋ฆฌ๊ณ ์๋ ๋ถ๋ถ์ด๋.. ๊ฐ์ ๋ด์ฉ์์ ๊ทธ๋ฐ ๋ถ๋ถ์ ์ฐธ๊ณ ๋ถํ๋๋ฆฝ๋๋ค. (์ค์ ๋ก๋ ๋ค๋ฅธ ์ฐ๋ ๋์์ ์ฌ๊ฐ(resume)๋์ด ์คํ๋ ์ ์๋ค๋ ๋ถ๋ถ์ ๋น์ฐํ ์์ ๋ค๋ (์ ๋ถ๋ถ์ ๊ฐ์ ๋ด์ฉ์ ๋ค ์ดํดํ์๊ณ ์๋ค๋) ๊ฐ์  ํ์ ์ต๋ํ ์ง๊ด์ ์ธ ์ค๋ช ์ ์ํ ๊ฐ์ ์ผ ๋ฟ์ ๋๋ค.) ๊ฐ์ฌํฉ๋๋ค. :) - 0
- 2
- 41
 
- Q&A - ImageProject ๊ด๋ จ ๋ฌธ์ - ๋ค ์๋ ํ์ธ์ ใ ใ  ๋.๊ฒฐ๊ตญ, ํด๋น ์ฝ๋์์๋.. ๋ค๋ฅธ ๊ฐ์ฒด(imageDownloader)๊ฐ ๊ฐ์ง๊ณ ์๋ ์บ์์ URL์ ๊ฐ์ง๊ณ ์๋ ์ฌ๋ถ์ ํ์ธ์ ํ๋ ค๊ณ ํ๋ ๊ฒ์ธ๋ฐ, Swift Concurrency์์๋ ๋ด๋ถ์ ์ผ๋ก await ์ฝ๋์ ์์ ์ ์ฌ์ง์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค๋ ๊ฒ์ด ๋ฌธ์ ์ฃ .๊ฒฐ๊ตญ "์์ฒญ ์์" ์์ ๋ถํฐ ===> "ํฌํจ ์ฌ๋ถ ํ์ธ ์๋ฃ" ์์ ๊น์ง ์ค๊ฐ์ await ์ฝ๋๊ฐ ํฌํจ๋์ด ์๋์ง์ ์ฌ๋ถ๊ฐ ์ค์ํฉ๋๋ค.1) ๋ฒ์ ๊ฒฝ์ฐlet keys = await imageDownloader.cache.keys if keys.contains(url) { return try await imageDownloader.image(from: url) }์์ฒญ ์์  ==== await (O) ====> ์บ์ ์ ๋ณด(keys) ๊ฐ์ ธ์ด ==== await (X) ====> ํฌํจ ์ฌ๋ถ ์์ฒญ ์์ ์์ ์บ์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ ์ฌ๋๊น์ง๋ await ์ฝ๋๊ฐ ์๊ธด ํ์ง๋ง, ์ค์  ์บ์ ์ ๋ณด๋ฅผ ํ์ธํ ์์  ์ดํ์๋ ๊ทธ ์บ์ ์ ๋ณด๊ฐ ๋ฐ๋์ง ์๋๋ค๋ ๊ฒ์ ๊ฐ์ ํ๋ ์ฝ๋๋ผ๊ณ ๋ณด์๋ฉด ๋๊ณ ์. (๋ฐ๋ผ์, ์ผ๋จ ์บ์ ์ ๋ณด์ ์ค๋ ์ท์ ํ์ธํ ์์ ์ดํ ์บ์ ๋ฐ์ดํฐ๋ ๋ณํ ํ์ด ์๋ค๊ณ ๋ณด๋ฉด ๋จ) 2) ๋ฒ์ ๊ฒฝ์ฐif await imageDownloader.cache.keys.contains(url) { return try await imageDownloader.image(from: url) }์์ฒญ ์์  ==== await (O) ====> containsํธ์ถ ์์  ==== await (O) ====> ํฌํจ ์ฌ๋ถ 2๋ฒ์ ๊ฒฝ์ฐ๋.. ์ด๋ป๊ฒ ๋ณด๋ฉด ์์ฒญ ์์ ๋ถํฐ ํ์ธ ์์ ๊น์ง ์  ๊ตฌ๊ฐ์ ๊ฑธ์ณ์, await์ฝ๋๊ฐ ์๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์.. ํด๋น ๊ฐ์ฒด(imageDownloader)์ ์ฌ๋ฌ ์์ฒญ(๋ฉ์๋ ํธ์ถ ๋ฑ)์ด ์๋ค๋ฉด, ์ค์  contains๋ฉ์๋๋ฅผ ํธ์ถํ ์์ ๋ถํฐ๋ ์ฌ์ง์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค๋ ๊ฒ์ด ๋ฌธ์ ๋ผ๊ณ ๋ณด์๋ฉด ๋ฉ๋๋ค. (์ฝ๊ฒ ๋ง์๋๋ฆฌ๋ฉด.. (์ค์  ์ฝ๋๊ฐ ๊ทธ๋ ๋ค๋๊ฒ ์๋๋ผ) ๋ ผ๋ฆฌ์ ์ผ๋ก ์๋ ์ฝ๋์ ๋น์ทํ๋ค๋ ๋ป์ ๋๋ค.)let keys = await imageDownloader.cache.keys let isCashed = await keys.contains(url) if isCashed { return try await imageDownloader.image(from: url) }๊ทธ๋ ๊ธฐ ๋๋ฌธ์, ์ฌ์ง์ ๋ฌธ์ ์ ๊ด๋ จํด์๋ 1๋ฒ ์ฝ๋๊ฐ ๋ ์์ ์ ์ธ ์ฝ๋๋ผ๊ณ ๋ง์๋๋ฆฌ๊ณ ์๋ ๊ฒ๋๋ค. ๋ค๋ค, lazy var๋ก ์ ์ธํ์๋๋ผ๋ (๊ธ๋ก๋ฒ ์กํฐ๋ก ๊ฒฉ๋ฆฌ๋) DiskStorage ํด๋์ค์ ๊ฒฝ์ฐ, DiskStorageํ์ ์ ์กด์ฌ ์์ฒด๊ฐ ImageDatabase์ ์์กดํ๊ณ ์๊ธฐ ๋๋ฌธ์ ๋ฐ์ํ๋ ๋ฌธ์ ๋ผ๊ณ ๋ณด์๋ฉด ๋ฉ๋๋ค.ImageDatabase๊ฐ ๋จผ์  ์ด๊ธฐํ ๋์ด์ผ ==> DiskStorage ์กด์ฌ ๊ฐ๋ฅ ==> ์กด์ฌํ๋ ค๋ฉด ImageDatabase ํ์ ์ด๋ฐ์์ผ๋ก ์ํํด์ ์์กด(ํ์)ํ๊ณ ์๊ธฐ ๋๋ฌธ์ด๋ผ๊ณ ๋ณด์๋ฉด ๋ ๊ฒ ๊ฐ์ต๋๋ค. lazy๋ก ์ ์ธํ๋ค๊ณ ํด์ ์ด์ฐจํผ ์ปดํ์ผ๋ฌ ์์ฒด๊ฐ ๋ ผ๋ฆฌ์ ์ธ ๋ชจ๋ ์์๋ฅผ ํ์ ํ ์ ์๋ ๊ฒ์ ์๋๊ธฐ ๋๋ฌธ์, ์ปดํ์ผ๋ฌ๋ DiskStorage ํ์ ์์ฒด์ ์ด๊ธฐํ ๋ฌธ์ ๋ก ๋ฐ๋ผ๋ณด๊ณ ์๋ ๊ฒ์ ๋๋ค. ๊ฐ์ฌํฉ๋๋ค. :) - 0
- 1
- 38
 






