์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- ๋ค์ด๋๋ฏนํ๋ก๊ทธ๋๋ฐ
- ๊ธฐ์ด๋ฌธ๋ฒ
- BFS
- GroupBy
- SwiftUI
- APPJAM
- algoritm
- Til
- concurrency
- HAVIT
- dfs
- discardableResult
- SOPT
- binarySearch
- ์ฐ์ํ์ค๋ถ๋ถ์์ด์ํฉ
- ๋์ ๊ณํ๋ฒ
- GCD
- ์ด์งํ์
- algorithm
- URLSession
- SQL
- Swift
- duno
- SwiftUI Tutorials
- SwiftUI ํํ ๋ฆฌ์ผ
- ํ๋ก๊ทธ๋๋จธ์ค
- 0์ด๋์ด์๋๊ธธ
- IOS
- ๊ณ ๋์ kit
- DynamicProgramming
- Today
- Total
suvera-dev ๐ฅฆ
iOS ) GCD ์ฌ์ฉ์ ์ฃผ์ํด์ผํ ์ฌํญ ๋ณธ๋ฌธ
1) ๋ฐ๋์ ๋ฉ์ธํ์์ ์ฒ๋ฆฌํด์ผํ๋ ์์ : UI๊ด๋ จ์ผ๋ค์ '๋ฉ์ธํ' ์์ ์ฒ๋ฆฌํด์ผ ํ๋ค.
DispatchQueue.global().async{
// ์ด๋ฏธ์ง ๋ค์ด๋ก๋ ๋ฑ ๊ด๋ จ ์ฝ๋
// ์ค๋๊ฑธ๋ฆฌ๋ ์์
์ด๋, ๋น๋๊ธฐ๋ก ๋ถ์ฐํด์ ์์
์ ์ฒ๋ฆฌํ๊ณ ์ถ์
์ฝ๋ 1
์ฝ๋ 2
...
DispatchQueue.main.async{
// ๋ค์ด๋ก๋ํ ์ด๋ฏธ์ง๋ฅผ ํ์ํ๋ ์ฝ๋
// UI ๊ด๋ จ ์์
์ ๋ค์ ๋ฉ์ธํ๋ก
self.imageView.image = image
}
}
๋ด๋ถ์ ์ผ๋ก ๋น๋๊ธฐ ์ฒ๋ฆฌ๊ฐ ๋์ด์๋ URLSession ์ฝ๋์์๋ ๋ค์ main ํ๋ก ๋ณด๋ธ๋ค.
// ์ด๋ฏธ์ง์บ์ ์ฒ๋ฆฌํ๋ ์์
var imageCache = [String: UIImage]()
class CustomImageView: UIImageView {
var lastImgUrlUsedToLoadImage: String?
func loadImage(with urlString: String) {
self.image = nil
// ๋ง์ง๋ง์ผ๋ก ์ด๋ฏธ์ง๋ฅผ ๋ค์ด๋ก๋ํ String๊ฒฝ๋ก
lastImgUrlUsedToLoadImage = urlString
// ์ด๋ฏธ์ง๊ฐ ์บ์์ ๋ค์ด ์๋์ง ํ์ธํ๊ธฐ
if let cachedImage = imageCache[urlString] {
self.image = cachedImage
return
}
// url
guard let url = URL(string: urlString) else { return }
// ๐พ URL์ธ์
์ ๋ด๋ถ์ ์ผ๋ก ๋น๋๊ธฐ๋ก ์ฒ๋ฆฌ๋ ํจ์์.
URLSession.shared.dataTask(with: url) { (data, response, error) in
if let error = error {
print("Failed to load image with error", error.localizedDescription)
}
if self.lastImgUrlUsedToLoadImage != url.absoluteString {
return
}
guard let imageData = data else { return }
let photoImage = UIImage(data: imageData)
imageCache[url.absoluteString] = photoImage
// ๐พ ์ด๋ฏธ์ง ํ์๋ DispatchQueue.main์์ ๐พ
DispatchQueue.main.async {
self.image = photoImage
}
}.resume()
}
}
2) sync๋ฉ์๋์ ๋ํ ์ฃผ์์ฌํญ : sync ๋ฉ์๋์ ๊ด๋ จํด ์ ๋ ํด์๋ ์๋๋ ์ฝ๋ 2๊ฐ์ง
- ๋ฉ์ธํ์์๋ ๋ค๋ฅธ ํ๋ก ๋ณด๋ผ ๋ sync ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์๋ ์๋๋ค
- ๋ฉ์ธํ์์๋ ํญ์ ๋น๋๊ธฐ์ ์ผ๋ก ๋ณด๋ด์ผํ๋ค.
- ํ์ฌ์ ํ์์ ํ์ฌ์ ํ๋ก ' ๋๊ธฐ์ ์ผ๋ก ' ๋ณด๋ด์๋ ์๋๋ค.
- ํ์ฌ์ ํ๋ฅผ ๋ธ๋ฝํ๋ ๋์์ ๋ค์ ํ์ฌ์ ํ์ ์ ๊ทผํ๊ธฐ ๋๋ฌธ์ ๊ต์ฐฉ์ํฉ ๋ฐ์
3) weak, strong ์บก์ฒ ์ฃผ์
- ARC, ํด๋ก์ ์บก์ฒ ๊ด๋ จ ๊ณต๋ถํ๊ธฐ
DispatchQueue.global(qos:.utility).async{[weak self] in
guard let self = self else { return }
DispatchQueue.main.async{
self.textLabel.text = "new posts updated!"
}
}
4) ๋น๋๊ธฐ ์์ ์์ ์ปดํ๋ฆฌ์ ํธ๋ค๋ฌ์ ์กด์ฌ์ด์
- ๋น๋๊ธฐ๋ก ์์ ์ ์ํค๊ณ ๋์, ์์ ์ ํด๋นํ๋ ๊ฐ์ ๋ฐ๋ก ์ฌ์ฉํ๋ฉด ์๋๋ค.
- ์์ ์ด ์์ง ์ข ๋ฃ๋์ง ์์๋๋ฐ ํด๋น ๊ฐ์ ์ ๊ทผํ๋ฉด, ์๋ชป๋ ๊ฐ์ ์ฌ์ฉํ ํ๋ฅ ์ด ๋๋ค
- ๊ทธ๋์ ํด๋น ๋น๋๊ธฐ ์์ ์ด ๋๋ฌ๋ค๋ ๊ฒ์ ์ ํํ ์๋ ค์ฃผ๋ ์์ ์ด ์ปดํ๋ฆฌ์ ํธ๋ค๋ฌ
5) ๋๊ธฐ์ ํจ์๋ฅผ ๋น๋๊ธฐํจ์ ์ฒ๋ผ ๋ง๋๋ ๋ฐฉ๋ฒ
- ์ฌ๋ฌ๋ฒ ์ฌํ์ฉํ๊ธฐ ์ํด
- URLSession๊ณผ ๊ฐ์ ์ด๋ฏธ ๋น๋๊ธฐ ํจ์๋ GCD/Operation์ด ํ์์๋ค
๐งธ weak self ์ถ๊ฐ ๊ณต๋ถ
- ARC(Automatic Reference Counting) : ์๋ ์ฐธ์กฐ ์นด์ดํ
- Heap(ํ)๋ฉ๋ชจ๋ฆฌ์ ํ ๋น๋๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ์ํด ARC ๋ฐฉ๋ฒ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ => ๊ฐํ ์ฐธ์กฐ ์ฌ์ดํด์ด ์ผ์ด๋ ๊ฐ๋ฅ์ฑ(Memory Leak)
- weak / unowned ์ฌ์ฉํด์ ํด๊ฒฐ
- ํด๋์ค์ ์ธ์คํด์ค(๊ฐ์ฒด), ํด๋ก์ => ํ ๋ฉ๋ชจ๋ฆฌ์ ํ ๋น
1) ํด๋์ค ์ธ์คํด์ค
- ๋ณ์๋ฅผ weak, unowned๋ก ์ ์ธ
=> ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ๋, RC๊ฐ ์ฌ๋ผ๊ฐ์ง ์๊ฒ ํ๋ฏ๋ก ๊ฐํ ์ฐธ์กฐ ์ฌ์ดํด ์ผ์ด๋์ง ์์
2) ํด๋ก์
- ํด๋ก์ ์ ์บก์ฒ๋ฆฌ์คํธ๋ด์์ + weak, unowned๋ก ์ ์ธ
=> ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ๋, RC๊ฐ ์ฌ๋ผ๊ฐ์ง ์๊ฒ ํ๋ฏ๋ก ๊ฐํ ์ฐธ์กฐ ์ฌ์ดํด ์ผ์ด๋์ง ์์
- ํด๋ก์ ์์ weak self ์ฌ์ฉ ์์ + guard ๋ฌธ ์ฌ์ฉํ์ฌ ์ต์ ๋ ์ฒ๋ฆฌ
class ViewController2: UIViewController {
var name: String = "๋ทฐ์ปจ"
func doSomething() {
// ๊ฐํ ์ฐธ์กฐ ์ฌ์ดํด์ด ์ผ์ด๋์ง ์์ง๋ง, ๊ตณ์ด ๋ทฐ์ปจํธ๋กค๋ฌ๋ฅผ ๊ธธ๊ฒ ์ก์๋ ํ์๊ฐ ์๋ค๋ฉด
// weak self๋ก ์ ์ธ
DispatchQueue.global().async { [weak self] in
sleep(3)
guard let weakSelf = self else { return }
print("๊ธ๋ก๋ฒํ์์ ์ถ๋ ฅํ๊ธฐ: \(weakSelf.name)")
DispatchQueue.main.async {
print("๋ฉ์ธํ์์ ์ถ๋ ฅํ๊ธฐ: \(weakSelf.name)")
}
}
}
deinit {
print("\(name) ๋ฉ๋ชจ๋ฆฌ ํด์ ")
}
}
func localScopeFunction2() {
let vc = ViewController2()
vc.doSomething()
}
localScopeFunction2()
์จ๋ฐ๋์ ๋์์ฑ ํ๋ก๊ทธ๋๋ฐ ๊ฐ์๋ฅผ ์ฐธ๊ณ ํ์ฌ ์ ๋ฆฌํ์์ต๋๋ค !
'iOS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
iOS) WKWebView (0) | 2022.03.28 |
---|---|
iOS) Modal dismissํ ํ CollectionView reload ํ๊ธฐ (0) | 2022.03.28 |
iOS ) URLSession ์์๋ณด๊ธฐ (2) | 2022.02.28 |
iOS ) iOS 15 UIButton.ConfigurationUpdateHandler (0) | 2022.02.05 |
iOS) CollectionView Cell - Drag & Drop (0) | 2022.02.01 |