ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Swift GCD
    Swift 2021. 5. 11. 17:36

    GCD 

    : Grand Central Dispatch  iOS의 Concurrent 프로그래밍의 근간이죠

     

    Thread를 자동으로 생성하고 효율적으로 관리해주는 api다.

    특히, Thread pool을 통해서 쓰레드를 재사용하기때문에 시스템 리소스를 상대적으로 적게 사용하면서 더 빠른 성능을 제공한다.

     

    Queue

    CoCoa 에서는 두가지 큐를 제공하는데 아주 짧게 정리하자면 아래와 같다.

    main(serial 큐) : 대기열에 등록한 순서대로 작업을 진행합니다. - 기본이고, 모든 UI의 업데이트는 메인에서 수행해야합니다.

    gloabl(concurrent 큐) : 실행중인 작업이 끝나길 기다리지 않고 병렬적인 쓰레드로 진행. 

     

     

    GCD의 핵심 객체는 Dispatch Queue 이다.

    FIFO Queue 

    - Concurrent Queue (병렬) = global

    동시에 작업을 진행한다. - gloabl dispatch 큐 

    - Serial Queue (직렬) = main

    기본적으로 생성. 큐에 추가된 순서대로 하나씩 실행. 

     

    우리가 흔히쓰는 Main Queue

    Main Queue는 메인쓰레드에서 동작하는 특별한 Serial Queue로 앱 시작 시점에 자동으로 생성된다.

     

    + sync 와 async의 개념을 알아 보았는데(https://kkimin.tistory.com/52) 여기서, Main Sync 사용이 에러가 나는 이유는 아래 잘 정리되어있습니다. 감사합니다.

    https://zeddios.tistory.com/519

    요약 : serial queue를 직접 만들면 잘 된다. main thread의 경우 thead-safe 하지 않아서 안되는것같다.

     

    Qos (Quality of Service) 

    Dispatch Queue의 우선순위 설정 방법, 동시작업되는 global queue에서 작업의 우선순위를 결정한다.

    Qos (Quality of Service) 로 리소스 사용 우선순위로 결정한다. (4가지)

    .userInteractive

    .userInitiated

    .utility

    .background

     

    우선순위가 높다는건 무엇일까?

     : 우선순위가 높을수록 cpu,네트워크,디스크등을 더 오래 사용할 수 있고 더 빠르게 실행된다.

     

    백그라운드에서 실행하면서, UI업데이트 등 메인에서 필요한 내용은 아래와 같이 작성한다.

    DispatchQueue.global().async {
    // 긴 작업등 로직 처리 (Network Tasks, File Tasks, Other Long Term)
    
    	DispatchQueue.main.async {
        	// UI 로직, User Event등 메인에서 작업해야 하는 내용
        }
    }
    우선 순위  
    .userInteractive main Thread에서의 작업, 애니메이션, 이벤트 처리 또는 UI 업데이트와 같은 사용자 상호 작용 작업
    시스템에서 가장 높은 우선 순위를 가짐.
    예를들어 애니메이션이나, event tracking에 사용
    https://developer.apple.com/documentation/dispatch/dispatchqos/1780708-userinteractive
    .userInitiated 사용자가 시작한 작업. 즉각적인 결과 제공 또는 사용자가 App을 사용하는동안 막는 작업
    시스템에서 두번째로 우선순위가 높음.
    예를 들어, 이메일 콘텐츠 내용을 로드해 display 할때 사용
    https://developer.apple.com/documentation/dispatch/dispatchqos/1780759-userinitiated
    `default` 기본, 기본은 위의 두가지 보다는 우선순위가 낮지만 아래 두가지 보다는 우선순위가 높다.
    GCD global queue는 이 level에서 실행된다고 함.
    .utility 사용자가 앱을 계속 사용하는 것을 방해하지 않는 작업.
    예를 들어, 유저가 계속 진행상황을 follow하지 않는 long running task (당장 기다리지 않음). 네트워킹, 큰 파일 불러오기
    작업 완료의 시간이 좀 걸림(몇초에서 몇분), 반응성에만 초점을 맞춘 위의 둘과 달리 반응 성능 에너이 효율 균형유지에 중점
    .background 가장 낮은 우선순위
    앱이 백그라운드에서 실행되는 동안 작업을 수행한다. 
    에너지 효율성에 중점.
    사용자가 당장 인식할 필요가 없는 위치 업데이트, 영상 다운로드 등

    사용자의 작업이 발생하지 않는 시간의 90%이상을 utility level에서 실행하기를 권장한다. 

     

    Operation Queue와 Dispatch Queue

    Operation 과 GCD의 차이는 아래에 설명했습니다.

     

    https://kkimin.tistory.com/52

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    728x90

    'Swift' 카테고리의 다른 글

    Operation Queue  (0) 2021.05.26
    컴파일 타임 / 런타임  (0) 2021.05.12
    Swift 의 용어 (알쓸신잡편)  (0) 2021.05.10
    Swift then 사용  (0) 2021.05.10
    Multiple commands produce Error 해결방법  (0) 2021.04.21

    댓글

Designed by Tistory.