[TIL] GCD - Main/Global, sync/async 실습 (22.09.02)

< 알바생 예시 >

한 명이 다 일하는 경우 ⇒ 동기(synchronous)

여럿이 나누어 일하는 경우 ⇒ 비동기(asynchronous)

매니저(큐)가 잘 관리하는 경우 ⇒ 동시(Concurrent)

매니저가 귀찮다! → 한명한테 다 주는 경우 ⇒ 직렬(Serial)

 

Swift Concurrnecy 구현 방법?

  1. GCD - 이전부터 쭉 잘 사용되어옴! (중지/재개 구현은 조금 어려움)
  2. OperationQueue - 중단/재개 등 기능들 더 잘 구현하기 위해 나옴! (내부적으로는 GCD 기반)
  3. Async/Await - 재작년(?)에 나옴.. 최소 버전 iOS 13

 

각각 하나씩 버튼을 만들어놓고 실습함

 

  • Serial(Main) / Sync
@IBAction func serialSync(_ sender: UIButton) {
    print("START", terminator: " ")

    for i in 1...100 {
        print(i, terminator: " ")
    }

    DispatchQueue.main.sync { // 본인이 해야하므로 무한 대기 상태에 들어감 -> 교착 상태 Deadlock
        for i in 101...200 {
            print(i, terminator: " ")
        }
    }

    print("END")
}

 

  • Serial(Main) / Async - 일 보내놓고 바로 다음 작업 → UI
@IBAction func serialAsync(_ sender: UIButton) {
    print("START", terminator: " ")

    DispatchQueue.main.async {
        for i in 1...100 {
            print(i, terminator: " ")
        }
    }

    for i in 101...200 {
        print(i, terminator: " ")
    }

    print("END")
} 
// START 101 102 ... 200 END \n 1 2 3 4 ... 100
  • global / sync - 여러 스레드에 분배, 기다렸다가 실행
@IBAction func globalSync(_ sender: UIButton) {
    print("START", terminator: " ")

    DispatchQueue.global().sync {
        for i in 1...100 {
            print(i, terminator: " ")
        }
    }

    for i in 101...200 {
        print(i, terminator: " ")
    }

    print("END")
} // 순서대로 출력
  •  Main thread에서 동작하는 것과 똑같음.. 어차피 나눠줘도 똑같이 기다려야 하므로 걸리는 시간은 같음. 의미없음!

 

  • global / async → 네트워크 통신

 

@IBAction func globalAsync(_ sender: UIButton) {
    print("START", terminator: " ")

    for i in 1...100 {
        DispatchQueue.global().async {
            print(i, terminator: " ")
        }
    }

    for i in 101...200 {
        print(i, terminator: " ")
    }

    print("END \(Thread.isMainThread)")
}

 

DispatchGroup

  • 동기 함수일 경우 문제없음
  • 비동기의 경우 다른 스레드에서 동작하기 때문에 순서대로 안됨

 

 

 

'공부하자! > iOS' 카테고리의 다른 글

메모마무 - 개인 정보 처리 방침  (3) 2022.09.30
메모마무 개발 - 중간 발표 이후  (0) 2022.09.26
[TIL] Codable  (0) 2022.08.29
[TIL] CodeBase UI + 코드 예제  (0) 2022.08.18
[TIL] 타입캐스팅  (0) 2022.08.18