iOS

[Swift] λ™μ‹œμ„± ν”„λ‘œκ·Έλž˜λ° 방법(+동기/비동기에 λŒ€ν•œ 이해)

year.number 2023. 5. 26. 17:58

 

 

 

 

πŸ’‘ μŠ€λ ˆλ“œ(Thread)에 λŒ€ν•΄ λ¨Όμ € 짚고 λ„˜μ–΄κ°€μž!

 

μ»΄ν“¨ν„°μ—μ„œ μ²˜λ¦¬ν•˜λŠ” 일의 λ‹¨μœ„λ₯Ό νƒœμŠ€ν¬λΌκ³  λΆ€λ₯΄κ³ , 이 νƒœμŠ€ν¬λŠ” ν”„λ‘œμ„ΈμŠ€λ‘œ λ§Œλ“€μ–΄μ™”λ‹€.

μ΄ˆλ°˜μ—λŠ” ν”„λ‘œμ„ΈμŠ€ λ‹¨μœ„λ‘œ μŠ€μΌ€μ€„λ§ν•˜κ³  μ—¬λŸ¬ ν”„λ‘œμ„ΈμŠ€λ₯Ό λ™μ‹œμ— μ‹€ν–‰μ‹œν‚€λŠ” λ‹€μ€‘ν”„λ‘œμ„ΈμŠ€ λ°©μ‹μœΌλ‘œ λ©€ν‹°νƒœμŠ€ν‚Ήμ„ μ‹€ν˜„ν–ˆλ‹€.

 

ν•˜μ§€λ§Œ ν”„λ‘œμ„ΈμŠ€ 생성/μ»¨ν…μŠ€νŠΈ μŠ€μœ„μΉ­μ˜ 큰 μ˜€λ²„ν—€λ“œ, ν”„λ‘œμ„ΈμŠ€ 사이 ν†΅μ‹ μ˜ 어렀움 λ“±μ˜ 문제점이 λ°œμƒν–ˆκ³ ,

κ·Έ λŒ€μ•ˆμœΌλ‘œ λ‚˜μ˜¨ 것이 λ°”λ‘œ μŠ€λ ˆλ“œμ΄λ‹€! μŠ€λ ˆλ“œλŠ” ν”„λ‘œμ„ΈμŠ€λ³΄λ‹€ μž‘μ€ 크기의 μ‹€ν–‰ λ‹¨μœ„λΌκ³  ν•  수 μžˆλ‹€.

μŠ€λ ˆλ“œμ˜ λ“±μž₯으둜 ν”„λ‘œμ„ΈμŠ€ λŒ€μ‹  μŠ€λ ˆλ“œκ°€ μ‹€ν–‰ λ‹¨μœ„κ°€ λ˜μ—ˆκ³ , μŠ€λ ˆλ“œλ₯Ό κ°€μ§€μ§€ μ•ŠλŠ” ν”„λ‘œμ„ΈμŠ€λŠ” 더이상 μ‘΄μž¬ν•˜μ§€ μ•Šκ²Œ λ˜μ—ˆλ‹€.

 

 

[νŠΉμ§•]

μŠ€λ ˆλ“œλŠ” κ°œλ°œμžμ—κ²Œ νƒœμŠ€ν¬λ₯Ό λ§Œλ“œλŠ” λ‹¨μœ„μ΄μž, μš΄μ˜μ²΄μ œμ—λŠ” μ‹€ν–‰ λ‹¨μœ„κ°€ λœλ‹€.

μŠ€λ ˆλ“œλŠ” μ½”λ“œ, 데이터, νž™, μŠ€νƒμ΄ μžˆλŠ” 싀체이닀.

ν”„λ‘œμ„ΈμŠ€λ₯Ό 생성할 λ•Œ 컀널은 μžλ™μœΌλ‘œ ν”„λ‘œμ„ΈμŠ€ 내에 1개의 μŠ€λ ˆλ“œλ₯Ό μƒμ„±ν•˜κ³ , 이 것을 메인 μŠ€λ ˆλ“œλΌκ³  λΆ€λ₯Έλ‹€.

 

 


 

처음 λ¬΄μž‘μ • μ–΄ν”Œμ„ λ§Œλ“€κΈ° μ‹œμž‘ν–ˆμ„ λ•Œ, μ„œλ²„λ‘œλΆ€ν„° 데이터λ₯Ό 뢈러였면 렉이 λ„ˆλ¬΄ 많이 κ±Έλ Έλ‹€!

κ·Έλž˜μ„œ λ‹¨μˆœνžˆ λ§₯뢁 μ„±λŠ₯의 λ¬Έμ œμΈκ°€?(κ³ κΈ‰ν˜•μΈλ°...) μ‹Άμ—ˆμ§€λ§Œ 사싀은 비동기 처리λ₯Ό ν•˜μ§€ μ•Šμ•„μ„œ λ°œμƒν•œ μΌμ΄μ—ˆλ‹€.

데이터 λΆˆλŸ¬μ˜€λŠ” 일을 λ‹€λ₯Έ ν•  일도 산더미인 메인 μŠ€λ ˆλ“œμ—λ§Œ μ‹œν‚€λ‹ˆκΉŒ λΆˆλŸ¬μ˜€λŠ”λ° 였래 κ±Έλ¦¬λŠ” 일을 μ‹œμΌœμ„œ 렉이 걸리게 된 것이닀.

 

κ·Έλž˜μ„œ 비동기 처리λ₯Ό 톡해 메인 μŠ€λ ˆλ“œμ—λ§Œ 맑겼던 일을 λ‹€λ₯Έ μŠ€λ ˆλ“œμ—λ„ λ‚˜λˆ μ£Όμ–΄ λΆ„μ‚° 처리λ₯Ό ν•΄μ£Όλ©΄ 일을 λΉ λ₯΄κ²Œ μ²˜λ¦¬ν•  수 μžˆλ‹€.

 

 

 

How to?

Q. Aμž‘μ—…μ€ Thread 1λ²ˆμ—μ„œ μ‹œν‚€κ³ , Bμž‘μ—…μ€ Thread 2λ²ˆμ—μ„œ μ‹œμΌœμ•Όκ² λ‹€! ⭕️  ❌

 

κ°œλ°œμžκ°€ μŠ€λ ˆλ“œμ—κ²Œ 직접 λͺ…λ Ήν•  수 μ—†λ‹€! κ°€ 정닡이닀.

일단 μž‘μ—…μ„ 큐(λŒ€κΈ°μ—΄)에 보내면 운영체제(iOS)κ°€ μ•Œμ•„μ„œ λΆ„μ‚°μ²˜λ¦¬λ₯Ό ν•΄μ€€λ‹€.

 

 

 

DispatchQueue

GCD의 κ°œλ…μœΌλ‘œ, 큐의 μ’…λ₯˜, QoS μš°μ„ μˆœμœ„, sync(동기), async(비동기)λ₯Ό μ„€μ •ν•΄μ„œ 메인 μŠ€λ ˆλ“œλ‚˜ λ‹€λ₯Έ μŠ€λ ˆλ“œμ—μ„œ μ‹€ν–‰ν•˜λ„λ‘ μ²˜λ¦¬ν•  수 μžˆλ‹€.

 

DispatchQueue μ‚¬μš© μ˜ˆμ‹œ

 

 

 

동기(sync)와 비동기(async)의 κ°œλ…

동기 비동기
μž‘μ—…μ„ λ‹€λ₯Έ μŠ€λ ˆλ“œμ—κ²Œ μ‹œν‚¨ λ’€, κ·Έ μž‘μ—…μ΄ 끝날 λ•ŒκΉŒμ§€ κΈ°λ‹€λ Έλ‹€κ°€ λ‹€μŒ μž‘μ—…μ„ μ§„ν–‰ μž‘μ—…μ„ λ‹€λ₯Έ μŠ€λ ˆλ“œμ—κ²Œ μ‹œν‚¨ λ’€, 기닀리지 μ•Šκ³  λ‹€μŒ μž‘μ—… μ§„ν–‰

 

 

직렬(Serial)κ³Ό λ™μ‹œ(Concurrency)의 κ°œλ…

직렬 λ™μ‹œ
λ‹€λ₯Έ 1개의 μŠ€λ ˆλ“œμ—μ„œ μž‘μ—… 처리 λ‹€λ₯Έ μ—¬λŸ¬ 개의 μŠ€λ ˆλ“œμ—μ„œ μž‘μ—… 처리