시간이 오래걸리는 작업 진행 시 어플리케이션의 실행을 방해하면 안되기에
멀티 코어에서 큰 작업을 여러개로 분할하여 진행해야 하기에
메모리 공간과 시스템 자원 절약하기 위해서
A :고려해야할 점은 어떤 작업을 글로벌 큐에 넣어야 하는지 정확히 알아둬야 하고
글로벌 큐에 작업을 배치할때, 작업에 따라 QoS를 적절하게 사용해야한다.
또한, 동기로 할지, 비동기로 할지를 명확하게 정의하고
상황에 따라 작업 간 인과관계를 설정하거나, 특정 시간 이후에 처리하도록 설정해야합니다.
A: 직접적으로 스레드를 관리하지 않고 Queue를 활용하여 작업을 분산 처리하고 GCD, Operation을 이용하여 iOS에서 알아서 스레드 숫자를 관리한다. 그리고 다른 스레드에서 작업들이 "비동기적으로 동작"하도록 만든다.
DispatchQueue.global().async { 작업의 한 단위 == task } //task는 동기적으로 작동함
QoS란, global queue를 사용할때, 작업마다 중요도를 매겨서 순위에 따라 처리하는 것
Queue에서 클로저 형태의 작업들은 두가지 방식으로 담기는데
Operation을 담아서 사용하는 Operation Queue → 큐 안에 담기는 것이 Operation
Serial? Concurrent?
maxConcrrentOperationCount 변수를 사용해서 분산 시킬 스레드 갯수를 결정 할 수 있음
default =-1 → iOS가 시스템 상황에 따라서 스레드 갯수 결정
maxConcrrentOperationCount = 1 → Serial
maxConcrrentOperationCount = 2 → Concrrent (2개 스레드 사용)
안 기다림
작업의 완료를 기다리지 않고 즉시 Return
메인 스레드에서 다른 스레드에 일을 넘기고 작업 완료까지 대기하지 않는다.
기다림
작업을 시작하고 끝날때까지 기다린다.
따라서 다른 스레드로 보내는 의미가 없다.
→ 동기적으로 코드를 작성해도 실질적으로 메인 스레드에서 작업을 진행한다.
분산처리 시킨 작업을 다른 한 개의 스레드에서 순서가 중요한 작업을 처리할때 사용
분산처리 시킨 작업을 다른 여러개의 스레드에서 각각 독립적이지만 유사한 여러개 작업을 처리할 때 사용
나중에 참조
[GCD] DispatchQueue.. main큐와 gloabal큐? sync와 asnyc? 궁금증 해결해보자.