본문 바로가기
프로그램 개발해서 돈벌기/iOS

[Swift] 병렬 프로그래밍(Concurrency Programming)

by ubmuhan 2022. 10. 27.
반응형

swift 병렬 프로그래밍(Concurrency Programming)

  • Thread
  • operationQueue
  • GCD(Grand Centeral Dispatch)

 

1. Thread

쓰레드 선언은 다음과 같다.

 

let thread_one = Thread(target: self, selector: 
				#selector(ViewController.runLoop_one), object: nil)
                
thread_one.start()

let thread_two = Thread(target: self, selector: 
				#selector(ViewController.runLoop_two), object: nil)
                
thread_two.start()

let thread_three = Thread(target: self, selector: 
				#selector(ViewController.runLoop_three), object: nil)
                
thread_three.start()

등록한 쓰레드 셀렉터(단순 숫자 카운트)

 

@objc func runLoop_one() {
    let nCountLimit = 100
    var nLoop = 0
    while(nLoop < nCountLimit){
          print("[thread one] : " + String(nLoop))
         nLoop = nLoop + 1
         Thread.sleep(forTimeInterval: 1)
    }
}
@objc func runLoop_two() {
    let nCountLimit = 100
    var nLoop = 0
    while(nLoop < nCountLimit){
         print("[thread two] : " + String(nLoop))
         nLoop = nLoop + 1
         Thread.sleep(forTimeInterval: 1)
    }
}
@objc func runLoop_three() {
    let nCountLimit = 100
    var nLoop = 0
    while(nLoop < nCountLimit){
         print("[thread three] : " + String(nLoop)) 
         nLoop = nLoop + 1
         Thread.sleep(forTimeInterval: 1)
    }
}

 

2. operationQueue

let operationQueue: OperationQueue = OperationQueue()
operationQueue.addOperation {
    let nCountLimit = 100
    var nLoop = 0
    while(nLoop < nCountLimit){
         print("[operationQueue one] : " + String(nLoop))
         nLoop = nLoop + 1
         Thread.sleep(forTimeInterval: 0.2)
    }
}
operationQueue.addOperation {
    let nCountLimit = 100
    var nLoop = 0
    while(nLoop < nCountLimit){
         print("[operationQueue two] : " + String(nLoop))
         nLoop = nLoop + 1
         Thread.sleep(forTimeInterval: 0.2)
    }
}
operationQueue.addOperation {
    let nCountLimit = 100
    var nLoop = 0
    while(nLoop < nCountLimit){
         print("[operationQueue three] : " + String(nLoop))
         nLoop = nLoop + 1
         Thread.sleep(forTimeInterval: 0.2)
    }
}

 

3. GCD Dispatch

  • main
  • global
  • custom

3.1. main

라벨과 같은 UI 객체를 컨드롤 할 수 있습니다. 

DispatchQueue.main.async {
    for i in 1...100 {
         self.m_strNum_1.text = String(i)
    }
}

 

3.2. global

DispatchQueue.global().async {
    for i in 1...100 {
        print("[DispatchQueue global] = \(i)")
    }
}

 

3.3. custom

DispatchQueue(label: "my define queue").async {
    for i in 1...100 {
         print("[my define queue] = \(i)")
    }
}

 

4. sync와 async

let globalQueue = DispatchQueue.global()        
globalQueue.async {
    for i in 1...100 {
                print("[DispatchQueue global async one] = \(i)")
    }        
}         
globalQueue.async {
    for i in 1...100 {
                print("[DispatchQueue global async two] = \(i)")
    }        
}         
globalQueue.async {
    for i in 1...100 {
         print("[DispatchQueue global async three] = \(i)")
    }        
}         
globalQueue.sync {
     for i in 1...100 {
         print("[DispatchQueue global sync one] = \(i)")
     }        
}         
globalQueue.sync {
    for i in 1...100 {
         print("[DispatchQueue global sync two] = \(i)")
    }        
}         
globalQueue.sync {
            for i in 1...100 {
                print("[DispatchQueue global sync three] = \(i)")
            }        
}

 

 

5. 여러 쓰레드를 묶어서 처리할 수 있습니다.

  • wait
  • notify

 

5.1. wait 사용

let group = DispatchGroup()        
group.enter()        
DispatchQueue.global().async {
    for i in 1...100 {
         print("[DispatchQueue global async one] = \(i)")
    }
    group.leave()        
}         
group.enter()        
DispatchQueue.global().async {
    for i in 1...100 {
         print("[DispatchQueue global async two] = \(i)")
    }
    group.leave()        
}         
group.wait(timeout: .distantFuture)        
print("two thread end")

 

5.2. notify 사용

let group = DispatchGroup()        
let queue = DispatchQueue.global()        
queue.async(group: group) {
    for i in 1...100 {
         print("[DispatchQueue global async one] = \(i)")
    }        
}        
queue.async(group: group) {
    for i in 1...100 {
         print("[DispatchQueue global async two] = \(i)")
    }        
}         
group.notify(queue: DispatchQueue.global()) {
    print("two thread end")        
}
반응형

댓글