developer.apple.com/documentation/foundation/runloop
사실 옵저버나 타이머등 RunLoop에는 굉장히 기술이 많습니다만... 제가 사용을 안해서
심화 포스팅은 나중에 ^^...;;
자바에서 멀티스레드를 쓰는것처럼 간단히 써보고 싶었는데
구글링시에 그런 글들은 많이 안보여서 제가 직접 써봤습니다 ㅠ
import Foundation
func forLoop(_ workName: String){
var result = 0
for _ in 1...10{
result += 1
}
print("[\(workName)] : \(result)")
}
var runLooop = RunLoop.current
DispatchQueue.global().async {
forLoop("global 1")
}
DispatchQueue.global().async {
forLoop("global 2")
}
DispatchQueue.global().async {
forLoop("global 3")
}
DispatchQueue.global().async {
forLoop("global 4")
}
runLooop.run()
지난 글에선 위에와 같은 예제로 멀티스레드를 한번 구현해봤습니다.
근데, 제가 스레드를 4개이상을 써야하는데 runLoop없이는 스레드가 구동이 안되서 한참을 헤멧었죠.
이유는, main thread는 프레임워크상 자동으로 runLoop을 생성하고 돌려줍니다.
반면 global쓰레드는 사용자가 직접 runLoop을 관리하여야 합니다. 어떻게 해야할까요?
RunLoop이란?
작업을을 스케쥴링하고 전달되는 이벤트를 조정하는 이벤트 처리 루프입니다.
이는 스레드가 작업이 없으면 쉬고, 있다면 일하게 하도록 고안되었습니다.
RunLoop 객체 생성
var runLoop = RunLoop.current
RunLoop 실행
runLoop.run()
객체 생성 후 실행전까지 queue에 올려놓은 스레드들에 대해서 runloop의 이벤트 핸들링이 가능합니다.
즉, 스레드마다 자신의 RunLoop객체를 가질수도 있습니다.
위의 예제를 사용해보면 특이점이 있습니다.
스레드들이 다 작업을 완료했음에도 어플리케이션은 종료되지 않고 계속 돌고있습니다.
사용이 끝난뒤 runloop를 종료시키는 방법은 두가지입니다.
RunLoop 종료시키기
첫번째로, RunLoop.run()시에 제약사항을 두는것 입니다.
두번째로는 RunLoop 객체 대신 CFRunLoop객체를 사용하는 것 입니다.
CFRunLoopGetCurrent()를 통해 얻어지는 CFRunLoop 객체는
CFRunLoopRun() 메서드를 통해 실행시킬 수 있습니다.
또한 CFRunLoopStop(_:CFRunLoop)를 사용해 사용자가 명시적으로 직접 종료할 수 있습니다.
let runLoop = CFRunLoopGetCurrent()
//스레드 1..
//스레드 2..
//스레드 3 : 위의 스레드가 종료 후 실행 {CFRunLoopStop(runLoop)}
CFRunLoopRun()
이런식으로 스레드 마지막에 종료 메서드를 넣어 사용할수도 있습니다.
'Language > Swift' 카테고리의 다른 글
[Swift] GCD로 경마 구현해보기 (0) | 2021.03.24 |
---|---|
Swift GCD(Grand Central Dispatch) [5] - Group, WorkItem (0) | 2021.03.23 |
Swift GCD(Grand Central Dispatch) [3] - 예제 사용해보기 (0) | 2021.03.22 |
Swift GCD(Grand Central Dispatch) [2] - DispatchQueue (0) | 2021.03.22 |
Swift GCD(Grand Central Dispatch) [1] - 멀티스레딩 기초 (0) | 2021.03.22 |