Bibi's DevLog πŸ€“πŸŽ

[iOS] NSOperation κ³Ό GCD(Grand Central Dispatch), DispatchQueue λ³Έλ¬Έ

πŸ“±πŸŽ iOS

[iOS] NSOperation κ³Ό GCD(Grand Central Dispatch), DispatchQueue

λΉ„λΉ„ bibi 2022. 3. 25. 12:27

[iOS] NSOperation κ³Ό GCD(Grand Central Dispatch), DispatchQueue

https://babbab2.tistory.com/65?category=831129

iOS μ—μ„œ μ œκ³΅ν•˜λŠ” λ©€ν‹°μŠ€λ ˆλ”©μ„ μœ„ν•œ APIμ—λŠ” μ„Έ μ’…λ₯˜κ°€ μžˆλ‹€.

  • NSOperation (OperationQueue)
  • NSThread (Thread)
  • GCD (Grand Central Dispatch) - (DispatchQueue)

NSOperation (NSOperationQueue)

Objective-C 기반의 κ³ μˆ˜μ€€ API

  • λ‚΄λΆ€μ μœΌλ‘œ C 둜 κ΅¬ν˜„λœ GCD λ₯Ό κ³ μˆ˜μ€€ μ–Έμ–΄λ‘œ λž˜ν•‘ν•œ 것.
  • μž₯점) GCD 에 μ—†λŠ” κΈ°λŠ₯듀을 μ‚¬μš©ν•  수 있음
    • μž‘μ—… μ·¨μ†Œ, μž‘μ—… μž¬μ‚¬μš©, KVO λ“±
  • 단점) GCD 보닀 무겁고, μ˜€λ²„ν—€λ“œ λ°œμƒ
  • λ™μž‘ 방식 : NSOperation 을 NSOperationQueue 에 μΆ”κ°€ν•˜μ—¬ μ‹€ν–‰

GCD (Grand Central Dispatch) - DispatchQueue

  • λ‚΄λΆ€μ μœΌλ‘œ C둜 κ΅¬ν˜„λ¨
  • μž₯점) NSOperation 보닀 가볍고 μ„±λŠ₯이 μ’‹μŒ, ν΄λ‘œμ €λ‘œ κ΅¬ν˜„λ˜μ–΄ μžˆμ–΄ μ½”λ“œ 가독성이 μ’‹μŒ, κ°„λ‹¨ν•˜κ²Œ μ‚¬μš© κ°€λŠ₯
  • 단점) λͺ‡λͺ‡ κΈ°λŠ₯을 직접 κ΅¬ν˜„ν•΄ μ£Όμ–΄μ•Ό 함 - μž‘μ—… μ·¨μ†Œ, μž‘μ—… μž¬μ‚¬μš©, KVO λ“±
  • λ™μž‘ 방식 : DispatchQueue λ₯Ό μ‚¬μš©

DispatchQueue

GCD 에선 DispatchQueueλ₯Ό 톡해 μž‘μ—…μ„ κ΄€λ¦¬ν•œλ‹€.

βœ… DispatchQueue μ—λŠ” 두 가지 νƒ€μž…μ΄ μ‘΄μž¬ν•œλ‹€. - Serial Queue, Concurrent Queue

  • Serial Queue
    • μž‘μ—…μ„ 순차적 처리. ν•œ λ²ˆμ— ν•˜λ‚˜μ˜ μž‘μ—…λ§Œ 처리
  • Concurrent Queue
    • λ™μ‹œμ— μ—¬λŸ¬ 개의 μž‘μ—… 처리.

βœ… DispatchQueue λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ‹€ν–‰κ³Ό λ™μ‹œμ— 2개의 큐가 μžλ™ μƒμ„±λœλ‹€. - Main Queue, Global Queue

  • Main Queue (Serial Queue)

    • public class var main: DispatchQueue { get }

    • 메인 μŠ€λ ˆλ“œμ—μ„œ μ‚¬μš©λ˜λŠ” Queue.

    • UI κ΄€λ ¨ μž‘μ—…μ„ μ΄κ³³μ—μ„œ μ²˜λ¦¬ν•΄μ•Ό 함

    • Main Queue 에 μž‘μ—…μ„ μΆ”κ°€ν•˜κ³  μ‹Άλ‹€λ©΄ μ•„λž˜μ™€ 같이 ν•  수 μžˆλ‹€

      • DispatchQueue.main.async {
           // μ›ν•˜λŠ” μž‘μ—…
          // DispatchQueue 쀑 main queue 에 async 둜 μž‘μ—…μ„ μΆ”κ°€ν•˜κ² λ‹€λŠ” 의미.
        }
    • Main Queue μ—λŠ” μ ˆλŒ€ Sync Task λ₯Ό μΆ”κ°€ν•  수 μ—†μŒ - 메인 μŠ€λ ˆλ“œκ°€ Thread-Safe ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έ. (main.sync : λŸ°νƒ€μž„ μ—λŸ¬)

  • Global Queue (Concurrent Queue)

    • public class func global(qos: DispatchQoS.QoSClass = .default) -> DispatchQueue

    • νŽΈμ˜μƒ μ‚¬μš©ν•  수 있게 λ§Œλ“€μ–΄μ Έ μžˆλŠ” Concurrent Queue 이닀.

    • QoS λ₯Ό μ§€μ›ν•œλ‹€ : μš°μ„  μˆœμœ„(priority)λ₯Ό 직접 λͺ…μ‹œν•  수 있음

    • Global Queue 에 μž‘μ—…μ„ μΆ”κ°€ν•˜κ³  μ‹Άλ‹€λ©΄ μ•„λž˜μ™€ 같이 ν•  수 μžˆλ‹€

      • DispatchQueue.global().sync {
          // μ›ν•˜λŠ” μž‘μ—…
          // DispatchQueue 쀑 global queue 에 sync 둜 μž‘μ—…μ„ μΆ”κ°€ν•˜κ² λ‹€λŠ” 의미
        }
        
        DispatchQueue.global().async {
          // μ›ν•˜λŠ” μž‘μ—…
          // DispatchQueue 쀑 global queue 에 async 둜 μž‘μ—…μ„ μΆ”κ°€ν•˜κ² λ‹€λŠ” 의미
        }
        
        DispatchQueue.global(qos: .userInteractive).sync {
           // μ›ν•˜λŠ” μž‘μ—…
           // 이와 같이 QoS λ₯Ό 직접 지정할 μˆ˜λ„ μžˆλ‹€.
        }