반응형
Greensky0026
삽질러의 대환장 공사판
Greensky0026
전체 방문자
오늘
어제
  • 분류 전체보기 (241)
    • Language (56)
      • JAVA (13)
      • Swift (38)
      • Kotlin (4)
      • Dart (0)
      • PHP (0)
      • JavaScript (1)
    • IDE & Framework (92)
      • Spring (10)
      • Android (48)
      • iOS (8)
      • NodeJS (1)
      • CodeIgniter (3)
      • Flutter (1)
      • 분류중 (18)
    • Infra (8)
    • Database (12)
    • VCS (4)
    • Debug Log (34)
      • java (7)
      • swift (3)
      • Android (9)
      • Web (7)
      • 삽질기 (7)
    • Others (19)
      • 코딩테스트 풀이 (0)
      • IT 이야기 (18)
    • 쉼터 (2)
    • 개발공부 (14)
      • Network (1)
      • 자료구조와 알고리즘 (2)
      • Code design (8)
      • ETC (1)
      • 아카이브 (1)

블로그 메뉴

    공지사항

    • 프로그래머스 코딩 테스트 관련글 비공개 처리

    인기 글

    태그

    • swift
    • 예제
    • Android
    • kotlin
    • Java
    • swfit
    • map
    • reduce
    • ios
    • IT
    • 코딩테스트
    • 개발
    • JSP
    • 타입
    • 공부
    • 프로그래밍
    • level1
    • 구축
    • xcode
    • 프로그래머스

    최근 댓글

    최근 글

    티스토리

    hELLO · Designed By 정상우.
    Greensky0026

    삽질러의 대환장 공사판

    Swift GCD(Grand Central Dispatch) [3] - 예제 사용해보기
    Language/Swift

    Swift GCD(Grand Central Dispatch) [3] - 예제 사용해보기

    2021. 3. 22. 10:50
    반응형

     앞서서는 GCD의 Global Queue를 사용하는데 필요한 이론을 알아봤으니, 이제 사용해보겠습니다.

     

    globla-aync-noneQoS 예제

    import Foundation
    
    func forLoop(_ workName: String){
        var result = 0
        for _ in 1...10{
            result += 1
        }
        print("[\(workName)] : \(result)")
    }
    
    var runLooop = RunLoop.current
    
    DispatchQueue.global().async {
        forLoop("global 1")
    }
    DispatchQueue.global().async {
        forLoop("global 2")
    }
    DispatchQueue.global().async {
        forLoop("global 3")
    }
    DispatchQueue.global().async {
        forLoop("global 4")
    }
    
    runLooop.run()

    결과는 1,2,3,4 순으로 출력되는것이 아니라 뒤죽박죽 출력됩니다.

    병렬연산을 하면서 우선순위또한 없기 떄문이죠.

     

    globla-aync-QoS 예제

    import Foundation
    
    func forLoop(_ workName: String){
        var result = 0
        for _ in 1...10{
            result += 1
        }
        print("[\(workName)] : \(result)")
    }
    
    var runLooop = RunLoop.current
    
    DispatchQueue.global(qos: .background).async {
        forLoop("global 1")
    }
    DispatchQueue.global(qos: .utility).async {
        forLoop("global 2")
    }
    DispatchQueue.global(qos: .userInitiated).async {
        forLoop("global 3")
    }
    DispatchQueue.global(qos: .userInteractive).async {
        forLoop("global 4")
    }
    
    runLooop.run()

     이렇게 Qos로 우선순위를 준다면, 결과는 아까보다 비교적 4, 3, 2, 1 순으로 출력되게 됩니다.

    예제가 단순히 결과출력만 하다보니 어떤 경향인지 자세히까진 안보일 수도 있는데,

    func forLoop(_ workName: String){
        var result = 0
        for _ in 1...10{
            result += 1
            print("[\(workName)] : \(result)")
        }
    
    }
    

    메서드를 이렇게 손보시면 좀 더 잘 보이실겁니다. 순차적으로 완벽히 까진 아니더라도 

    우선순위가 높은 작업을 먼저 수행하려는 경향이 있습니다.

     

    globla-sync 예제

    import Foundation
    
    func forLoop(_ workName: String){
        var result = 0
        for _ in 1...10{
            result += 1
        }
        print("[\(workName)] : \(result)")
    }
    
    var runLooop = RunLoop.current
    
    DispatchQueue.global().sync {
        forLoop("global 1")
    }
    DispatchQueue.global().sync {
        forLoop("global 2")
    }
    DispatchQueue.global().sync {
        forLoop("global 3")
    }
    DispatchQueue.global().sync {
        forLoop("global 4")
    }
    
    runLooop.run()

    이번엔 1,2,3,4로 무조건 실행되는 결과를 보실 수 있습니다.

    sync가 순차적으로 작업을 실행할 수 있는 이유는

    '다음 작업의 실행을 제한'하는 방식으로 작동되기 떄문입니다.

     

    추가로, 메인스레드를 활용해 UI를 작업하는 방식은 다음과 같습니다.

    DispatchQueue.global(qos: .userInteractive).async {
        forLoop("선행 작업")
        DispatchQueue.main.async {
            print("선행 작업 후 UI 변경")
     }

     

     

     

     

     

     그런데 이상한점이 있죠? RunLoop 저 친구는 뭘까요?

    위의 예제에서 runLoop.run()을 실행하지 않으면 2개의 작업만이 처리됩니다. 왤까요?

    RunLoop?

     RunLoop란 입력 소스를 처리하는 이벤트 처리 루프로, 스레드가 작업이 없다면 쉬게 합니다.

    Main Thread에서는 프레임워크가 자동으로 RunLoop을 설정하고 실행하지만

    Global Thread는 사용자가 직접 RunLoop을 설정하고 실행해야 합니다 ㅎ

    그래서 위의 예제에서 RunLoop을 직접 실행시켜주었습니다.

    RunLoop에 대해서는 다음 포스팅에 자세히 다루도록 하겠습니다.

    반응형

    'Language > Swift' 카테고리의 다른 글

    Swift GCD(Grand Central Dispatch) [5] - Group, WorkItem  (0) 2021.03.23
    Swift GCD(Grand Central Dispatch) [4] - RunLoop 실행과 종료  (0) 2021.03.23
    Swift GCD(Grand Central Dispatch) [2] - DispatchQueue  (0) 2021.03.22
    Swift GCD(Grand Central Dispatch) [1] - 멀티스레딩 기초  (0) 2021.03.22
    Swift 서브스크립트 (Subscripts)  (0) 2021.03.21
      'Language/Swift' 카테고리의 다른 글
      • Swift GCD(Grand Central Dispatch) [5] - Group, WorkItem
      • Swift GCD(Grand Central Dispatch) [4] - RunLoop 실행과 종료
      • Swift GCD(Grand Central Dispatch) [2] - DispatchQueue
      • Swift GCD(Grand Central Dispatch) [1] - 멀티스레딩 기초
      Greensky0026
      Greensky0026
      점이 모여 선이 된다. 내 삽질도 언젠간 거대한 지하 도시가 되겠지!

      티스토리툴바