반응형
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)

블로그 메뉴

    공지사항

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

    인기 글

    태그

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

    최근 댓글

    최근 글

    티스토리

    hELLO · Designed By 정상우.
    Greensky0026

    삽질러의 대환장 공사판

    Swift GCD(Grand Central Dispatch) [4] - RunLoop 실행과 종료
    Language/Swift

    Swift GCD(Grand Central Dispatch) [4] - RunLoop 실행과 종료

    2021. 3. 23. 15:37
    반응형

    developer.apple.com/documentation/foundation/runloop

     

    Apple Developer Documentation

     

    developer.apple.com

    developer.apple.com/library/archive/documentation/Cocoa/Conceptual/Multithreading/AboutThreads/AboutThreads.html#//apple_ref/doc/uid/10000057i-CH6-SW2

     

    About Threaded Programming

    About Threaded Programming For many years, maximum computer performance was limited largely by the speed of a single microprocessor at the heart of the computer. As the speed of individual processors started reaching their practical limits, however, chip m

    developer.apple.com

     

     사실 옵저버나 타이머등 RunLoop에는 굉장히 기술이 많습니다만... 제가 사용을 안해서

    심화 포스팅은 나중에 ^^...;;

    자바에서 멀티스레드를 쓰는것처럼 간단히 써보고 싶었는데

    구글링시에 그런 글들은  많이 안보여서 제가 직접 써봤습니다 ㅠ


     

     

     

    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()
    

     지난 글에선 위에와 같은 예제로 멀티스레드를 한번 구현해봤습니다.

    근데, 제가 스레드를 4개이상을 써야하는데 runLoop없이는 스레드가 구동이 안되서 한참을 헤멧었죠. 

    이유는, main thread는 프레임워크상 자동으로 runLoop을 생성하고 돌려줍니다.

    반면 global쓰레드는 사용자가 직접 runLoop을 관리하여야 합니다. 어떻게 해야할까요?

     

     

    RunLoop이란?

     작업을을 스케쥴링하고 전달되는 이벤트를 조정하는 이벤트 처리 루프입니다.

    이는 스레드가 작업이 없으면 쉬고, 있다면 일하게 하도록 고안되었습니다.  

     

    RunLoop 객체 생성

    var runLoop = RunLoop.current

     

    RunLoop 실행

    runLoop.run()

     객체 생성 후 실행전까지 queue에 올려놓은 스레드들에 대해서 runloop의 이벤트 핸들링이 가능합니다.

    즉, 스레드마다 자신의 RunLoop객체를 가질수도 있습니다.

     

     위의 예제를 사용해보면 특이점이 있습니다.

    스레드들이 다 작업을 완료했음에도 어플리케이션은 종료되지 않고 계속 돌고있습니다.

    사용이 끝난뒤 runloop를 종료시키는 방법은 두가지입니다.

     

    RunLoop 종료시키기

     첫번째로, RunLoop.run()시에 제약사항을 두는것 입니다.

     

     두번째로는 RunLoop 객체 대신 CFRunLoop객체를 사용하는 것 입니다.

    CFRunLoopGetCurrent()를 통해 얻어지는 CFRunLoop 객체는 

    CFRunLoopRun() 메서드를 통해 실행시킬 수 있습니다.

    또한 CFRunLoopStop(_:CFRunLoop)를 사용해 사용자가 명시적으로 직접 종료할 수 있습니다.

       let runLoop = CFRunLoopGetCurrent()
       //스레드 1..
       //스레드 2..
       //스레드 3 : 위의 스레드가 종료 후 실행 {CFRunLoopStop(runLoop)}
       CFRunLoopRun()

    이런식으로 스레드 마지막에 종료 메서드를 넣어 사용할수도 있습니다.

     

    반응형

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

    [Swift] GCD로 경마 구현해보기  (0) 2021.03.24
    Swift GCD(Grand Central Dispatch) [5] - Group, WorkItem  (0) 2021.03.23
    Swift GCD(Grand Central Dispatch) [3] - 예제 사용해보기  (0) 2021.03.22
    Swift GCD(Grand Central Dispatch) [2] - DispatchQueue  (0) 2021.03.22
    Swift GCD(Grand Central Dispatch) [1] - 멀티스레딩 기초  (0) 2021.03.22
      'Language/Swift' 카테고리의 다른 글
      • [Swift] GCD로 경마 구현해보기
      • Swift GCD(Grand Central Dispatch) [5] - Group, WorkItem
      • Swift GCD(Grand Central Dispatch) [3] - 예제 사용해보기
      • Swift GCD(Grand Central Dispatch) [2] - DispatchQueue
      Greensky0026
      Greensky0026
      점이 모여 선이 된다. 내 삽질도 언젠간 거대한 지하 도시가 되겠지!

      티스토리툴바