jabberkr avatar

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

xmasdolf

Published: 11 Jun 2018 › Updated: 11 Jun 2018

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

개발도구 : xcode 9.4

언어 및 버전 : swift 4.1

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")        
}

Leave IOS swift 병렬 프로그래밍(Concurrency Programming) to:

Written by

Read more #ios posts


Best Posts From jabberkr

We have not curated any of xmasdolf's posts yet. But you can encourage our curation team to review posts by visiting them regularly and by referring other readers. Because we give priority to frequently read content.

More Posts From jabberkr