Thread & GCD

Thread?

어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위를 말한다. 프로그램 환경에 따라 둘 이상 의 스레드를 동시에 실행할 수 있다. 이러한 실행 방식을 멀티스레드(multithread)라고 한다.

iOS Thread

모든 app은 기본적으로 main thread를 가지고 있다.

UIKit은 오직 app의 main thread에서만 실행된다.

Multi Thread

교착상태(Dead lock)

iOS에서 MultiThread를 사용하는 방법

  1. Thread : 직접 thread를 만들어서 제어, 멀티 코어 지원 안함
  2. ⭐️ GCD : 클로저 기반, Operation에 비해 저수준 API, 멀티 코어 지원
  3. Operation Queue : GCD 기반의 wrapper class. 고수준의 API를 제공. (GCD보다는 한 단계 더 거치므로 성능이 조금 느린 편)
  4. ⭐️ Perform Selector : Selector를 이용한 방식, GCD 이후엔 많이 사용되진 않는다.
  5. ⭐️ Timer : 간단한 interval Notification(특정 시간 간격마다 체크)를 제공해 주는 Class. 단, Timer는 main Loop에서 실행된다.

Timer 샘플코드

class ViewController: UIViewController {

    @IBOutlet weak var mainLB: UILabel!
    @IBAction func action(_ sender: UIButton) {
        longTimeAction2()
        mainLB.text = "Thread Test"
    }
    
    // Timer는 메인 스레드에서 돌지만, UI도 같이 돌리는게 가능하다.
    func longTimeAction1() {
        var count = 0
        Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { (t) in
            self.mainLB.text = String(count)
            count += 1
        }
    }
    
    // MainLoop
    func longTimeAction2() {
        var total = 0
        Timer.scheduledTimer(withTimeInterval: 1, repeats: false) { (t) in
            for n in 1...1000000 {
                total += n
                print(total)
            }
        }
    }

}




GCD(Grand Central Dispatch)

→ DispatchQueue

main: Main Thread, 기본 UI를 제어하는 Serial queue

global: app 전역에 사용, Concurrent queue

custom: init으로 label 및 attribute, qos 등 옵션 설정 가능

Attributes

Quality Of Service? (QoS) : 우선순위

Dispatch Work Item

실행하는 방법

func useWorkItem() {
   var value = 10
   let workItem = DispatchWorkItem {
value += 5 }
  
   workItem.perform()
  
   let queue = DispatchQueue.global(qos: .utility)
   queue.async(execute: workItem)
  
   workItem.notify(queue: DispatchQueue.main) {
       print("value = ", value)
   }
}




참고지식

참고지식: 동기/비동기

참고지식: 네트워크를 통해 데이터를 주고 받는 속도