728x90
반응형
어떤 용량이 대빵 큰 이미지를 다운 받는 실험을 해보자..
그러면 다운을 받아오기까지 그 외의 작업은 아예 못하는 것을 볼 수 있다. 토글 버튼을 움직이는 거나 등등 아무 것도 할 수 없다.
그러면 global 큐에 넣어서 비동기로 동시에 작업을 해줬을 경우에 어떤지 한 번 확인해보자!
사진을 받아오는 동안에 다른 작업이 가능하다!
그러나 사진을 받아오는 도중에 코드 상에서 보라색으로 경고창이 하나 뜬다.
UIImageView.image must be used from main thread only
이미지는 메인스레드에서 사용되어야 한다.
그래서 이 말을 따라서 이미지뷰를 넣어주는 작업을 메인 스레드에서 처리해줬다.
그랬더니 오류가 생기지 않았다. 애플에서는 자체적으로 UI 작업은 메인스레드에서 처리를 하도록 하고 있다.
@IBAction func downloadButton(_ sender: Any) {
let url = "https://apod.nasa.gov/apod/image/2208/M13_final2_sinfirma.jpg"
print("1", Thread.isMainThread)
DispatchQueue.global().async { // 동시에 여러 작업이 가능하게 해줘!
print("2", Thread.isMainThread)
let data = try! Data(contentsOf: URL(string: url)!)
let image = UIImage(data: data)
DispatchQueue.main.async {
print("3", Thread.isMainThread)
self.imageView.image = image
}
}
}
1 true - Main Thread였다가
2 false - Main Thread가 아니였다가
3 true - UI작업처리는 Main Thread
동기 sync, 비동기 async, 직렬, 동시
굉장히 헷갈리는 개념인데 찬찬히 아주 잠깐 훑고 지나가면
동기와 비동기는 동시에 작업을 처리하냐 마냐는 문제이다.
직렬과 동시는 동시에 작업을 처리하긴 할 건데 한 개의 스레드로 갈 건지, 여러개의 스레드로 분산시킬 건지
https://huree-can-do-it.notion.site/1-GCD-Operation-3de2c4b4ca2c43cf9738eb0ca6a3eefe
728x90
반응형
'⭐️ 개발 > iOS & Swift' 카테고리의 다른 글
[Swift] required init?(coder: NSCoder) (0) | 2022.08.10 |
---|---|
[iOS] Swift Attribute 중 @IBInspectable과 @IBDesignable (0) | 2022.08.09 |
[Swift] 강순참이 존재하게 된 이유... (0) | 2022.08.05 |
[Swift] 일급 객체, Closure (1) (0) | 2022.08.03 |
[iOS] Alamofire, SwiftyJSON을 사용해서 HTTP 통신하기 (0) | 2022.08.02 |