GCD에 대해 자세히 알아보자
📖GCD(Grand Central Dispatch)
대기열의 개념을 이용해 작업을 분산처리하고 iOS에서 알아서 쓰레드 개수를 관리해, 멀티 쓰레딩 처리를 쉽고 편하게 해주는 API
📖Dispatch Queue
이전 노트에서 큐에 넣기만 하면 알아서 쓰레드를 분배해준다고 했는데, GCD에서의 해당 큐가 바로 요거
큐의 종류,QoS,Sync/Async에 대한 설정 가능
📎Main Queue
작업을 메인 쓰레드에서 처리
let mainQueue = DispatchQueue.main- 메인 쓰레드(1번 쓰레드)에서 동작 (작업을 메인 쓰레드에서 처리)
- 직렬(Serial) 큐
📎Global Queue
작업을 메인 쓰레드가 아닌 다른 쓰레드에서 처리
let userInteractiveQueue = DispatchQueue.global(qos: .userInteractive) // 소요 시간: 거의 즉시
let userInitiatedQueue = DispatchQueue.global(qos: .userInitiated) // 소요 시간: 몇초
let defaultQueue = DispatchQueue.global(qos: .default) // 기본값
let utilityQueue = DispatchQueue.global(qos: .utility) // 소요 시간: 몇초에서 몇분
let backgroundQueue = DispatchQueue.global(qos: .background) // 소요 시간: 몇분 이상(에너지 효율)
let unspecifiedQueue = DispatchQueue.global(qos: .unspecified) // 오래된 API 지원- QoS에 따라 6가지 종류가 존재하는 글로벌(전역) 대기열
qos를 지정하지 않을 시 default로 설정- 동시(Concurrent) 큐
QoS(Quality of Service)
iOS가 알아서 우선적으로 중요한 작업을 인지하고 우선순위를 매겨 더 많은 쓰레드를 사용하고, 배터리를 집중적으로 사용해서 우선순위가 높은 큐의 작업들을 더 빨리 끝내도록 하는 개념
- 서비스의 품질에 따라 나뉨
- 서비스 품질이 높을수록 여러 쓰레드를 사용
📎Private(Custom) Queue
유저가 직업 Dispatch Queue를 생성하고 설정
let privateQueue = DispatchQueue(label: "Private Queue")- 기본값 : 직렬(Serial) 큐 (
attribute을 통해 동시(Concurrent) 큐로도 만들 수 있음) label을 통해 디버깅 툴에서 큐를 고유하게 식별- QoS를 통해 작업 우선순위 지정 가능
📖GCD 사용 시 주의 사항
📎UI와 관련된 작업은 반드시 메인 쓰레드(메인 큐)에서 처리해야 함
UI와 관련된(유저 인터페이스) 작업은 메인 큐를 통해 메인 쓰레드로 보내 메인 쓰레드에서 처리해야 함

📎콜백함수를 올바르게 사용해야 함
비동기적인 함수는 작업의 실행 후 해당 작업을 기다리지 않고 리턴해 다음 작업을 진행하므로, 비동기적인 함수의 결과물을 사용하는 다른 작업이 존재할 경우 문제가 발생함 즉, 함수의 작업 결과를 반환하는 리턴형으로 콜백함수를 설계해서는 안 됨
비동기적인 함수는 작업의 실행 후 해당 작업을 기다리지 않고 리턴해 다음 작업을 진행함
그렇기 때문에, 특정 작업의 결과물을 사용/의존하는 다른 작업이 존재할 경우 문제가 될 수 있음
이러한 경우 어떻게 해결할 수 있을까?
함수의 작업 결과를 반환하는 리턴형으로 콜백함수를 설계해서는 안 됨
함수 내부의 일이 끝나는 시점에 클로저를 호출하도록 함수를 설계해야 함
클로져의 파라미터명 : completionHandler (관습적)
즉, 비동기적인 함수를 실행시킨 다음에 그 일이 다 끝나면 그 결과를 받아 클로저(콜백함수)를 실행하겠다 이런 식으로 설계해야 해
콜백함수 클로져에 대해 깊은 이해가 필요함 ㅜㅜㅜ 공부햇
https://velog.io/@leeyoungwoozz/TIL-2021.04.30-Fri 근데 swift5.5에서 비동기 함수의 리턴이 가능한 async/await가 도입 추후 정리하장
콜백 함수
함수의 전달인자로 쓰는 함수 즉, 파라미터에 함수를 넣을 수 있는데 그 함수가 콜백함수임 보통 클로져를 많이 사용
📎weak, strong 캡처의 주의
강한 참조는 클로져의 수명 주기가 길어지는 현상이 발생하므로 강한 참조 사이클이 일어나지 않더라도 주의할 필요성이 있음
객체에 대한 캡쳐 현상 주의 객체 내에서 비동기 코드를 사용할 때 셀프를 캡쳐할 일이 많음 캡처리스트 + 약한 참조를 선언하지 않으면 기본적으로 강한 참조 → 강한 참조는 클로저의 수명주기가 길어지는 현상 발생 가능 → 캡처리스트 안에서 weak self를 선언하자
캡처 캡처리스트 공부해
동기 함수를 비동기 함수로 변형
오래 걸리는 작업을 동기 함수로 만들면 메인 쓰레드에 부하가 와 반응성과 성능이 떨어질 수 있음 → 오래 걸리는 작업을 내부에 내부적으로 다른 큐로 감싸 비동기적 처리를 해 비동기로 동작하는 함수로 변형하자
