Skip to content

Latest commit

Β 

History

History
247 lines (208 loc) Β· 7.73 KB

GCD-API.md

File metadata and controls

247 lines (208 loc) Β· 7.73 KB

GCD API λ™μž‘ 방식과 ν•„μš”μ„±μ— λŒ€ν•΄ μ„€λͺ…ν•˜μ‹œμ˜€.

도움을 받은 κΈ€

κ΄€λ ¨λœ λ‹΅λ³€

Answer

κ°œλ…

쉽고 νŽΈν•œ λ©€ν‹° μŠ€λ ˆλ”©μ˜ 처리λ₯Ό μœ„ν•΄ Appleμ—μ„œλŠ” 두가지 APIλ₯Ό μ œκ³΅ν•œλ‹€.

  • GCD(Grand Central Dispatch) - C기반의 μ €μˆ˜μ€€ API
  • NSOperation - Obj-C기반의 κ³ μˆ˜μ€€ API
    • GCD보닀 μ•½κ°„μ˜ μ˜€λ²„ν—€λ“œ λ°œμƒ 및 느린 속도λ₯Ό κ°–κ³  μžˆμ§€λ§Œ GCDμ—μ„œ 직접 μ²˜λ¦¬ν•΄μ•Όν•˜λŠ” μž‘μ—…(KVOκ΄€μ°°, μž‘μ—…μ·¨μ†Œ λ“±)을 μ§€μ›ν•˜κ³  μžˆκΈ°μ— κ°μˆ˜ν•˜κ³  μ‚¬μš©ν•  만 함

κ·Έ μ€‘μ—μ„œ GCDμ—λŠ” DispatchQueueλΌλŠ” ν΄λž˜μŠ€κ°€ μ‘΄μž¬ν•œλ‹€. 그리고 이 ν΄λž˜μŠ€λŠ” μ‹€μ œλ‘œ ν•΄μ•Όν•  Taskλ₯Ό 담아두면 μ„ νƒλœ μŠ€λ ˆλ“œμ—μ„œ 싀행을 ν•΄μ£ΌλŠ” 역할을 ν•œλ‹€.

DispatchQueue

Serial/Concurrent와 sync/asyncλŠ” λ³„κ°œμ˜ κ°œλ…μ΄λ‹€

  • μ’…λ₯˜

    • Serial Dispatch Queue
      • Serial QueueλŠ” λ“±λ‘λœ μž‘μ—…μ„ ν•œλ²ˆμ— ν•˜λ‚˜μ”© μ°¨λ‘€λŒ€λ‘œ 처리
      • μ²˜λ¦¬μ€‘μΈ μž‘μ—…μ΄ μ™„λ£Œλ˜λ©΄ λ‹€μŒ μž‘μ—…μ„ 처리
    • Concurrent Dispatch Queue
      • Concurrent QueueλŠ” λ“±λ‘λœ μž‘μ—…μ„ ν•œλ²ˆμ— ν•˜λ‚˜μ”© 처리 ν•˜μ§€ μ•Šκ³  μ—¬λŸ¬ μž‘μ—…λ“€μ„ λ™μ‹œμ— 처리
  • λ©”μ„œλ“œ

    • sync
      • λ™κΈ°μ²˜λ¦¬ λ©”μ„œλ“œ
      • 큐에 μž‘μ—…μ„ μΆ”κ°€ν–ˆμœΌλ©΄ 그게 λλ‚ λ•ŒκΉŒμ§€ β€œκΈ°λ‹€λ¦¬λŠ”β€ 것(세탁기 λŒλ €λ†“κ³  λ‹€ λŒμ•„κ°ˆλ•ŒκΉŒμ§€ 쀑지)
    • async
      • λΉ„λ™κΈ°μ²˜λ¦¬ λ©”μ„œλ“œ
      • 큐에 μž‘μ—…μ„ μΆ”κ°€ν•œ λ’€, κΈ°λ‹€λ¦¬λŠ”κ²ƒλ„ μ—†κ³  κ·Έλƒ₯ λ‹€λ₯Έ μž‘μ—…μ„ λ°”λ‘œ ν•  수 μžˆλŠ” 것(세탁기 λŒλ €λ†“κ³  μ±… μ½λŠ” 것)

μ•± μ‹€ν–‰μ‹œ μ‹œμŠ€ν…œμ—μ„œ 기본적으둜 2개의 Queueλ₯Ό λ§Œλ“€μ–΄μ€€λ‹€.

let wsQueue = DispatchQueue(label: "ws") μ΄λŸ°μ‹μœΌλ‘œ μ»€μŠ€ν…€ 큐 생성도 κ°€λŠ₯ν•˜λ‹€

  • main queue
    • 메인 μŠ€λ ˆλ“œ(UI μŠ€λ ˆλ“œ)μ—μ„œ μ‚¬μš© λ˜λŠ” Serial Queue
    • λͺ¨λ“  UI μ²˜λ¦¬λŠ” 메인 μŠ€λ ˆλ“œμ—μ„œ μ²˜λ¦¬ν•΄μ•Ό 함
  • global queue
    • νŽΈμ˜μƒ μ‚¬μš©ν• μˆ˜ 있게 λ§Œλ“€μ–΄ 놓은 Concurrent Queue
    • Global QueueλŠ” 처리 μš°μ„  μˆœμœ„λ₯Ό μœ„ν•œ qos(Quality of service) νŒŒλΌλ―Έν„°λ₯Ό 제곡
    • λ³‘λ ¬μ μœΌλ‘œ λ™μ‹œμ— 처리λ₯Ό ν•˜κΈ°λ•Œλ¬Έμ— μž‘μ—… μ™„λ£Œμ˜ μˆœμ„œλŠ” μ •ν•  수 μ—†μ§€λ§Œ μš°μ„ μ μœΌλ‘œ 일을 μ²˜λ¦¬ν•˜κ²Œ ν•  수 μžˆλ‹€


λ™μž‘λ°©μ‹

  • Concurrent && sync
    // MARK: - Concurrent && sync
    DispatchQueue.global().sync {
        for i in 1...5 {
                print(i)
            }
            print("==================")
    }
    
    for i in 100...105 {
            print(i)
        }
        print("==================")
    • result

      큐가 Concurrent이긴 ν•˜μ§€λ§Œ syncμ΄κΈ°λ•Œλ¬Έμ— 순차적으둜 μ‹€ν–‰λœλ‹€.

      1
      2
      3
      4
      5
      ==================
      100
      101
      102
      103
      104
      105
      ==================

  • Serial && sync

    main.sync둜 μ½”λ“œλ₯Ό μž‘μ„±ν•˜μ§€ μ•Šμ€ 이유?

    // MARK: - Serial && sync
    let wsQueue = DispatchQueue(label: "ws")
    
    wsQueue.sync {
        for i in 1...5 {
                print(i)
            }
            print("==================")
    }
    
    for i in 100...105 {
            print(i)
        }
        print("==================")
    • result

      Concurrent && sync 와 κ²°κ³Όκ°€ κ°™λ‹€.

      1
      2
      3
      4
      5
      ==================
      100
      101
      102
      103
      104
      105
      ==================

  • Concurrent && async
    // MARK: - Concurrent && async
    DispatchQueue.global().async {
        for i in 1...5 {
            print("\(i)πŸš€")
        }
        print("==================")
    }
    DispatchQueue.global().async {
        for i in 200...205 {
            print("\(i)πŸ₯•")
        }
        print("==================")
    }
    
    for i in 100...105 {
        print("\(i)πŸ‘»")
    }
    • result

      μ‹€ν–‰μ‹œλ§ˆλ‹€ μˆœμ„œλŠ” λ‹€λ₯΄λ‹€.
      async이며 큐도 Concurrentμ΄λ―€λ‘œ λ™μ‹œλ‹€λ°œμ μœΌλ‘œ μ½”λ“œκ°€ μ‹€ν–‰λœλ‹€.

      100πŸ‘»
      200πŸ₯•
      1πŸš€
      101πŸ‘»
      201πŸ₯•
      2πŸš€
      102πŸ‘»
      202πŸ₯•
      203πŸ₯•
      3πŸš€
      204πŸ₯•
      103πŸ‘»
      4πŸš€
      205πŸ₯•
      ==================
      5πŸš€
      ==================
      104πŸ‘»
      105πŸ‘»

  • Serial && async
    // MARK: - Serial && async
    wsQueue.async {
        for i in 1...5 {
            print("\(i)πŸš€")
        }
        print("==================")
    }
    wsQueue.async {
        for i in 200...205 {
            print("\(i)πŸ₯•")
        }
        print("==================")
    }
    
    for i in 100...105 {
        print("\(i)πŸ‘»")
    }
    • result

      μ‹€ν–‰μ‹œλ§ˆλ‹€ μˆœμ„œλŠ” λ‹€λ₯΄λ‹€.
      async이기 λ•Œλ¬Έμ— πŸ‘»μ΄λž‘μ€ 같이 λ‚˜μ˜€μ§€λ§Œ 큐가 Serialμ΄λ―€λ‘œ 무쑰건 πŸš€μ΄ λλ‚˜μ•Ό πŸ₯•μ΄ λ‚˜μ˜¨λ‹€.

      100πŸ‘»
      101πŸ‘»
      102πŸ‘»
      1πŸš€
      103πŸ‘»
      2πŸš€
      3πŸš€
      4πŸš€
      5πŸš€
      ==================
      104πŸ‘»
      105πŸ‘»
      200πŸ₯•
      201πŸ₯•
      202πŸ₯•
      203πŸ₯•
      204πŸ₯•
      205πŸ₯•
      ==================


ν•„μš”μ„±

  • GCD μ΄μ „μ˜ λ©€ν‹° μŠ€λ ˆλ”©

    λ©€ν‹° μ½”μ–΄ ν”„λ‘œμ„Έμ„œμ—μ„œλŠ” ν”„λ‘œκ·Έλž¨μ˜ λ™μž‘μ„ λ©€ν‹° ν”„λ‘œμ„Έμ„œμ—κ²Œ μ–΄λ–»κ²Œ 잘 λ°°λΆ„ν•˜λŠ”μ§€κ°€ μ€‘μš”ν•˜λ‹€.
    GCD μ΄μ „μ—λŠ” λ©€ν‹° μŠ€λ ˆλ”©μ„ μœ„ν•΄ Thread와 OperationQueue λ“±μ˜ 클래슀λ₯Ό μ‚¬μš©ν–ˆλŠ”λ°, ThreadλŠ” λ³΅μž‘ν•  뿐만 μ•„λ‹ˆλΌ μž„κ³„ ꡬ역 (Critical Section) 등을 μ΄μš©ν•œ Lock을 κ΄€λ¦¬ν•˜κΈ° κΉŒλ‹€λ‘œμ› λ‹€. 그리고 OperationQueueλŠ” GCD에 λΉ„ν•΄ 무겁고 Boilerplate Code듀이 많이 ν•„μš”ν•œ λ¬Έμ œκ°€ μžˆμ—ˆλ‹€.

  • GCD의 λ“±μž₯

    κ·Έλž˜μ„œ Apple은 GCDλ₯Ό λ‚΄λ†“κ²Œλœλ‹€.

    GCDλŠ” λ©€ν‹° μ½”μ–΄ ν”„λ‘œμ„Έμ„œ μ‹œμŠ€ν…œμ— λŒ€ν•œ μ‘μš© ν”„λ‘œκ·Έλž¨ 지원을 μ΅œμ ν™”ν•˜κΈ° μœ„ν•΄ Appleμ—μ„œ κ°œλ°œν•œ 기술둜, μŠ€λ ˆλ“œ 관리와 싀행에 λŒ€ν•œ μ±…μž„μ„ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ ˆλ²¨μ—μ„œ 운영체제 레벨둜 λ„˜κ²¨λ²„λ¦°λ‹€. GCD의 μž‘μ—…λ‹¨μœ„λŠ” Block(Swiftμ—μ„œλŠ” 클둜져)라고 뢈리며, DispatchQueueκ°€ 이 Block듀을 κ΄€λ¦¬ν•œλ‹€.

    GCDλŠ” 각 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ μƒμ„±λœ DispatchQueueλ₯Ό μ½λŠ” λ©€ν‹°μ½”μ–΄ 싀행엔진을 가지고 μžˆλŠ”λ°, 이것이 Queue에 λ“±λ‘λœ 각 μž‘μ—…λ“€μ„ κΊΌλ‚΄μ„œ μŠ€λ ˆλ“œμ— ν• λ‹Ήν•΄μ€€λ‹€. κ·Έλ ‡κΈ° λ•Œλ¬Έμ— κ°œλ°œμžλŠ” λ‚΄λΆ€ λ™μž‘μ„ μžμ„Ένžˆ μ•Œ ν•„μš”μ—†μ΄ Queue에 μž‘μ—…μ„ λ„˜κΈ°κΈ°λ§Œ ν•˜λ©΄ λ˜μ–΄μ„œ, Threadλ₯Ό 직접 μƒμ„±ν•˜κ³  κ΄€λ¦¬ν•˜λŠ” 것에 λΉ„ν•΄ 관리도 μš©μ΄ν•˜κ³  μ„±λŠ₯ λ©΄μ—μ„œλ„ 쒋은 κ²°κ³Όλ₯Ό 얻을 수 μžˆλ‹€.

    이것이 GCDκ°€ ν•„μš”ν•œ μ΄μœ μ΄λ‹€.