GCD (grand central dispatch)

original source : https://blog.bobthedeveloper.io/intro-to-grand-central-dispatch-in-swift-3-with-bob-lee-1d4b56f731b3 

gcd에서는 기본적으로 두가지의 종류의 작업자를 제공한다. (하나는 많은 리소스를 필요로하는 작업에 적합하고(heavy) 하나는 좀더 약한 작업에 적합하다(lightweight). 사용자가 추가로 필요한 경우 lightweigth 작업자를 추가 만들수 있다.)

let main = DispatchQueue.main // heavy 작업자 만들기
let background = DispatchQueue.global() // ios에서 제공하는 lightweight 작업자 만들기
let helper = DispatchQueue(label: "construction_worker_3") // 추가로 lightweight 작업자 만들기
func doSyncWork() { 
background.sync { for _ in 1...3 { print(“Light”) } }
for _ in 1...3 { print(“Heavy”) } } // main
doSyncWork() 
// Light
// Light
// Light
// Heavy
// Heavy
// Heavy

func doAsyncWork() { 
background.async { for _ in 1...3 { print(“Light”) } }
for _ in 1...3 { print(“Heavy”) } }                // main
doAsyncWork() 
// Light
// Heavy
// Heavy
// Light
// Heavy
// Light
let asianWorker = DispatchQueue(label: "construction_worker_1")
let brownWorker = DispatchQueue(label: "construction_worker_2")
func doLightWork() {
asianWorker.async { for _ in 1...10 { print("👷") } }
 brownWorker.async { for _ in 1...10 { print("👷🏽") } } }
doLightWork()
// 👷, 👷🏽, 👷, 👷🏽, 👷, 👷🏽, 👷, 👷🏽, 👷...

참조) https://learnappmaking.com/grand-central-dispatch-swift/

함수형태의 gcd 이용 예시 (swift 3 이전형태)

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {  
    // Download file or perform expensive task

    dispatch_async(dispatch_get_main_queue()) {  
        // Update the UI  
    }
}

oop 형태의 gcd 이용 예시 (swift 3 이후형태)

DispatchQueue.global(qos: .userInitiated).async {  
    // Download file or perform expensive task

    DispatchQueue.main.async {  
        // Update the UI  
    }
}

dispatch_async와 dispatch_sync 와의 차이

https://stackoverflow.com/a/19822753/3151712

DispatchQueue에서의 qos, concurrency(제빠르게 threads간에 switch함으로써 동시에 일어나는 착각일으킴)

https://medium.com/@JoyceMatos/grand-central-dispatch-swift-3-93f995c15fd2


core data 

managed object context

  • performBlock:  Asynchronously performs a given block on the context’s queue.
  • performBlockAndWait:  Synchronously performs a given block on the context’s queue.

concurrency에 관한 tutorial

core data에서 concurrency를 이용하는 이유는 data persistence가 file에 저장하는데 시간이 걸리는데 이 동안 main ui thread가 막힘이 없게 하는것이 목적이다.

https://www.youtube.com/watch?v=lMT96wUsjMQ&index=9&list=PL23Revp-82LImHA8jL2dLaN_67pABFcyJ


Operation Queue

참고사항) https://agostini.tech/2017/07/30/understanding-operation-and-operationqueue-in-swift/#comment-141

operation을 이용한 threading 작업은 GCD를 기반으로 한다.

class 클래스이름: Operation {

   init() {

     …

   }

   override func main() {
        …
       }        

}

의 형태를 가진 작업을 만든다. 

// operationqueue를 생성한다.

private let operationQueue: OperationQueue = OperationQueue()

operationQueue.addOperations([생성된Operation, 생성된또다른Operation], waitUntilFinished: false)

수행하려는 작업이 다른 작업의 완료에 의존하는 경우(다른작업이 확실히 끝나고 나서 수행해야하는 경우)  

나중에수행될Operation.addDependency(우선수행되야하는Operation)

You might think that with OperationQueues and Operations there’s no need for GCD but they actually work together. Fun fact: Operations are built on top of GCD.Queue is a prioritised FIFO queue. he most common use of GCD is to run a piece of code on the main thread – like the ‘onCompleted’ closure in our example here: 

DispatchQueue.main.async(execute: {
  onCompleted?(listItems)
})

Comments are closed.

Post Navigation