๋ณธ ๊ฒ์๋ฌผ์ ์จ๋ฐ์ ์ธํ๋ฐ ๊ฐ์๋ฅผ ๋ฃ๊ณ ์์ฑํ ๊ธ ์ ๋๋ค.
1. ๋ฐ๋์ ๋ฉ์ธํ์์ ์ฒ๋ฆฌํด์ผํ๋ ์์
์์ ์ ๋์คํจ์นํ์ ๋ํด ์๊ฒ ๊ณต๋ถํ ๋ ์คํ์ค๋ฒํ๋ก์ฐ์์ UI์ ๊ด๋ จ๋ ์์ ์ ๋ฉ์ธํ์์ ์ฒ๋ฆฌํด์ผํ๋ค๋ ๊ธ์ ๋ณธ ์ ์ด ์๋ค. ๊ทธ๋๋ ๊ทธ๋ฅ ๊ทธ๋ ๊ตฌ๋ ํ๊ณ ๋์ด๊ฐ๋๋ฐ ๊ทธ๋ฅ ๋ด ๋จธ๋ฆฌ์ "UI์์ -> ๋ฉ์ธ์์ ์ฒ๋ฆฌํด์ผํจ" ์ด์ ๋๋ก๋ง ์ธ์ํ๊ณ ์์๋ค.
์ด๋ฒ์ ๋น๋๊ธฐ์ ๋ํด ์ข ๋ ์์ธํ ๊ณต๋ถํ๋ฉด์ UI๊ด๋ จ ์์ ์ ๋ฉ์ธ์์ ์ฒ๋ฆฌํด์ผํจ์ ๋ค์ ๋ฃ๊ฒ ๋์๊ณ , ๊ทธ ์ด์ ๋ ํจ๊ป ์๊ฒ ๋์๋ค.
์๊ฐํด๋ณด๋ฉด ๊ฐ๋จํ๋ค. ๋ค๋ฅธ ์ค๋ ๋๋ก ๋ถ์ฐํด์ ์ฒ๋ฆฌํ๋ค๋ฉด ์์ ์ ์์๊ฐ ์ผ์ ํ์ง ์๊ณ , ๋ค๋ฅธ ์ค๋ ๋์์ ๋๋ ์ ์ฒ๋ฆฌํ๋ฉด์ ๊ฐ์ญ์ด ์ผ์ด๋๊ฒ ๋๋ฉด์ ํ๋ฉด์ด ๊น๋นก๊ฑฐ๋ฆฌ๋ ๋ฑ์ ์ ๋๋ก ๋ ํ๋ฉด์ ์ฌ์ฉ์์๊ฒ ์ ๊ณตํ๊ธฐ ์ด๋ ค์ธ ์ ์๋ค.
๋ฉ์ธํ์์ ์ฒ๋ฆฌํด์ผํ๋ค๊ณ ํ์ง๋ง ์ฌ์ค ๋ฉ์ธ์ผ๋ก ๋ค์ ๋์๊ฐ์ผํ๋ ์์ ์ด ๋ฒ๊ฑฐ๋ก์ธ ๋ฟ ํ๊ฐ์ ์ค๋ ๋์์ ๋ด๋นํ๋ฉด ๋๋ค๊ณ ํ๋ค.
DispatchQueue.global().async {
// code
DispatchQueue.main.async {
self.imageView.image = image // UI๊ด๋ จ ์์
}
}
์์ ๊ฐ์ ์ฝ๋๊ฐ ์์ ๋, globalํ์์ ์ฒ๋ฆฌํ๋ ์์ ์ main์์ ์ฒ๋ฆฌํ๊ณ ์๋ค.
UI๊ด๋ จ ์์ ์ด๊ธฐ ๋๋ฌธ์ ์์ ๊ฐ์ ๋ฐฉ์์ผ๋ก mainํ์์ ์ฒ๋ฆฌํ๊ณ ์์์ ํ์ธํ ์ ์๋ค.
2. sync๋ฉ์๋์ ๋ํ ์ฃผ์์ฌํญ
(sync ๋ฉ์๋์ ๊ด๋ จํด ์ ๋ ํด์๋ ์๋๋ ์ฝ๋ 2๊ฐ์ง)
1) ๋ฉ์ธํ์์ ๋ค๋ฅธํ๋ก ๋ณด๋ผ๋ sync๋ฉ์๋๋ฅผ ๋ถ๋ฅด๋ฉด ์ ๋ ์๋๋ค.
sync๊ฐ ์๋ async๋ฅผ ์ฌ์ฉํด์ผํ๋ค. ์ฆ, ๋ฉ์ธํ์์๋ ํญ์ ๋น๋๊ธฐ์ ์ผ๋ก ๋ณด๋ด์ผํ๋ค.
์๋ํ๋ฉด sync๋ฅผ ์ฌ์ฉํ๋ฉด ๋น๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌํ์ง ์๊ธฐ ๋๋ฌธ์ ํ๋์ ์์ ์ด ๋๋ ๋ ๊น์ง ๊ธฐ๋ค๋ฆฌ๊ฒ ๋๋ค.
๊ทธ๋ผ๋ฉด ํ๋ฉด์ ๋ด๋นํ๋ ์์ ์ ๋ฒ๋ฒ ์ด๋ ํ์๊ณผ ๊ฐ์ด UI๊ฐ ๋ฉ์ถฐ ์ ์ ์๊ฒ ๋ฆ๊ฒ ๋ฐ์ํ๊ฒ ๋๋ฌธ์ ์ฌ๋ฐ๋ฅธ ํ๋ฉด์ ์ ์งํ๊ธฐ ์ํด์๋ ์ฌ์ฉํ๋ฉด ์๋๋ค.
2) ํ์ฌ์ ํ์์ ํ์ฌ์ ํ๋ก ๋๊ธฐ์ ์ผ๋ก ๋ณด๋ด์๋ ์๋๋ค.
DispatchQueue.global().async {
DispatchQueue.global().sync {
}
}
// ์ด๋ ๊ฒ ์ฌ์ฉํ์ง ์๋๋ค.
์ฆ, async๋ก ๋ณด๋ธ๊ฒ์ ๋ค์ sync๋ก ๋ณด๋ด๋ ํ๋์ ํด์๋ ์๋๋ค๋ ๊ฒ์ด๋ค.
๊ทธ ์ด์ ๋ ํ์ฌ์ ํ๋ฅผ ๋ธ๋ฝํ๋ ๋์์ ๋ค์ ํ์ฌ์ ํ์ ์ ๊ทผํ๊ธฐ ๋๋ฌธ์ ๊ต์ฐฉ์ํฉ์ด ๋ฐ์ํ๋ค.
๊ต์ฐฉ์ํฉ์ด๋ ๊ฐ๋จํ ๋งํด ์ด๋ ํ ์ด์ ์์๊ฐ์ ์์ ์งํ์ด ๋ฉ์ถฐ, ์งํ๋์ง ๋ชปํ๋ ์ํฉ์ ์๋ฏธํ๋ค.
๋ง์ฝ ์ด๋ค ์์ ์ ๋น๋๊ธฐ์ ์ผ๋ก ์ค๋ ๋์ ๋ณด๋ธ๋ค๋ฉด ๋ณด๋ธ ์ฆ์ ๋ค์ ํ๋ก ๋์์จ๋ค. ์ด๋ ๋ค์ ๋์ผํ ์ค๋ ๋๋ก ์ ๊ทผํ๋ค๋ฉด ์ด๋ฏธ block์ผ๋ก ๋ง์๋ฒ๋ ธ๋๋ฐ ๋ค์ ์ ๊ทผํ๊ธฐ ๋๋ฌธ์ ๊ต์ฐฉ์ํ๊ฐ ๋๋ค.
๋ฌด์กฐ๊ฑด ๊ต์ฐฉ์ํ๊ฐ ์ผ์ด๋๋๊ฑด ์๋๋ค. ๋ณด๋ธ ๋์ผํ ์ค๋ ๋์ ์ ๊ทผํ๊ฒ ์๋๋ผ ๋ค๋ฅธ ์ค๋ ๋์ ๋ค์ ๋ฐฐ์น๋์๋ค๋ฉด ๊ต์ฐฉ์ํ๊ฐ ๋ฐ์ํ์ง ์์ง๋ง ๊ต์ฐฉ์ํ๊ฐ ๋ฐ์ํ ์ํ์ด ์๊ธฐ ๋๋ฌธ์ ์ด ๋ฐฉ๋ฒ์ ์ง์ํ๋ค. ๋ํ ์ง๋ ฌํ์ผ๋๋ ๊ต์ฐฉ์ํฉ์ด ๋ฐ์ํ์ง ์๋๋ค.
3. weak, strong์บก์ณ ์ฃผ์
DispatchQueue.global(qos: .utility).async {[weak self] in
guard let self = self else { return }
DispatchQueue.main.async {
self.textLabel.text = "New Posts updated!"
}
}
์ ์ฝ๋์์ ์ฒซ๋ฒ์งธ ๋์คํจ์นํ์์๋ [weak self]๋ฅผ ์ ์ด์ค๋ค. ์ด๋ ๊ฐ์ฒด์ ๋ํ ์บก์ณํ์์ด ๋ฐ์ํ๋๋ฐ ์ด๋ ๊ทธ ๋ด๋ถ์ ์๋ ๋์คํจ์นํ(๋ฉ์ธ)์๋ [weak self]๋ฅผ ์ ์ด์ค๊ฒ๊ณผ ๋์ผํ๊ฒ ๋์ํ๋ค.
4. (๋น๋๊ธฐ ์์ ์์) ์ปดํ๋ฆฌ์ ํธ๋ค๋ฌ์ ์กด์ฌ์ด์
๋น๋๊ธฐ๋ก ์์ ์ ์ํจ ํ ์์ ์ ํด๋ฑํ๋ ๊ฒ์ ๋ฐ๋ก ์ฌ์ฉํ๋ฉด ์๋๋ค.
์์ ์ด ์์ง ์ข ๋ฃํ์ง ์์๋๋ฐ ํด๋น ๊ฐ์ ์ ๊ทผํ๋ฉด ์๋ชป๋ ๊ฐ์ ์ฌ์ฉํ ํ๋ฅ ์ด ๋๋ค.
๊ทธ๋์ ํด๋น ๋น๋๊ธฐ ์์ ์ด ๋๋ฌ๋ค๋ ๊ฒ์ ์ ํํ ์๋ ค์ฃผ๋ ์์ ์ด ์ปดํ๋ฆฌ์ ํธ๋ค๋ฌ์ด๋ค.
๋น๋๊ธฐ ํจ์์ ๊ด๋ จ๋ ์์ ๋ค์ ๋ชจ๋ ์ปดํ๋ฆฌ์ ํธ๋ค๋ฌ๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
๊ฐ๋จํ ์์ ์ผ ๋๋ ๊ด์ฐฎ์๋ ์ค๋ ๊ฑธ๋ฆฌ๋ ์์ ์ ๋๋๋ ์์ ์ ์์์ผํ๋ค. ์ด ์์ ์ ์ปดํ๋ฆฌ์ ํธ๋ค๋ฌ๋ผ ํ๋ค.
5. ๋๊ธฐ์ ํจ์๋ฅผ ๋น๋๊ธฐ ํจ์์ฒ๋ผ ๋ง๋๋ ๋ฐฉ๋ฒ
์ฌ๋ฌ๋ฒ ์ฌํ์ฉ ํ๊ธฐ ์ํด ์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ค. ๋๊ธฐ์ ๋ฐฉ๋ฒ์ด ์ค๋๊ฑธ๋ฆฌ๋ค ๋ณด๋ ๋ด๋ถ์ ์ผ๋ก ๋น๋๊ธฐ์ ๋์์ ํ๊ฒ ํ๊ณ ์ถ์ด์ ธ ์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ค.
URLSession๊ณผ ๊ฐ์ ๋น๋๊ธฐํจ์๋ ์ด๋ฏธ GCD์ Operation์ด ๋ด์ฅ๋์ด ์๊ธฐ ๋๋ฌธ์ ํ์ํ์ง ์๋ค.
'iOS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[iOS] ๋์์ฑ๊ณผ ๊ด๋ จ๋ ๋ฌธ์ (Concurrency Problems) (0) | 2022.12.16 |
---|---|
[iOS] ๋์คํจ์น ๊ทธ๋ฃน(Dispatch Group) (0) | 2022.12.13 |
[iOS] ๋์คํจ์นํ(GCD)์ ์ข ๋ฅ์ ํน์ฑ (๋ฉ์ธํ, ๊ธ๋ก๋ฒํ, ํ๋ผ์ด๋นํ) (0) | 2022.12.07 |
[iOS] GCD์ Operation, ๋๊ธฐ์ ๋น๋๊ธฐ, ์ง๋ ฌ๊ณผ ๋์ (1) | 2022.12.05 |
[iOS/Swift] Github OAuth - ๊นํ๋ธ ๋ก๊ทธ์ธ ๊ตฌํํ๊ธฐ (2) | 2022.10.08 |