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:
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.