UI관련 작업은 반드시 메인큐에서 처리해야한다.
아래와 같이어떤 작업 끝에 UI 작업이 있다면 반드시 다시 main스레드로 보내야 한다.
DispatchQueue.global().async {
// 이미지 다운로드 코드
...
...
DispatchQueue.main.async {
self.imageView.image = image
}
}
sync 메서드와 관련해서 절대 해서는 안되는 2가지
메인큐에서 다른큐로 보낼때, sync메서드를 부르면 절대 안된다.
DispatchQueue.global().async {
DispatchQueue.main.sync {
}
}
위와 같은 코드를 쓰게되면 그림과 같이 main 스레드를 block시키는 현상이 발생하기 때문에 DispatchQueue.main.sync
는 사용할 수 없는 코드이다.
현재 큐를 블럭(sync에서)하는 동시에 다시 현재의 큐에 접근(async에서 수행하는 동작)하려고 하기 때문에 Deadlock이 발생한다.
DispatchQueue.global().async {
DispatchQueue.global().sync {
...
}
}
비동기적인 코드를 수행할 때, 캡쳐된 변수의 약한 참조와 강한 참조를 잘 구분해서 사용해야한다.
URLSession과 같은 이미 비동기 함수는 GCD/Operation 같은 녀석을 별도로 선언해서 사용할 필요가 없다.(내장 되어 있기 때문)