Swift 3에서 현재 스레드가 무엇인지 어떻게 확인합니까?
이전 버전의 Swift에서는 다음을 수행하여 현재 스레드가 주 스레드인지 확인할 수있었습니다.
NSThread.isMainThread()
답변
단순히 Thread.isMainThread
Swift 3에있는 것 같습니다.
답변
Thread.isMainThread
현재 기본 UI 스레드에 있는지 여부를 나타내는 부울을 반환합니다. 그러나 이것은 현재 스레드를 제공하지 않습니다. 메인에 있는지 여부 만 알려줍니다.
Thread.current
현재있는 스레드를 반환합니다.
답변
스레드 및 대기열을 인쇄하는 확장을 만들었습니다.
extension Thread {
class func printCurrent() {
print("\r⚡️: \(Thread.current)\r" + "?: \(OperationQueue.current?.underlyingQueue?.label ?? "None")\r")
}
}
Thread.printCurrent()
결과는 다음과 같습니다.
⚡️: <NSThread: 0x604000074380>{number = 1, name = main}
?: com.apple.main-thread
답변
Swift 4 이상 :
Thread.isMainThread
Bool
사용자가 Main Thread에 있거나 Not에있는 경우 누군가가 대기열 / 스레드의 이름을 인쇄하려는 경우이 확장이 도움이 될 것이라는 내용을 반환합니다 .
extension Thread {
var threadName: String {
if let currentOperationQueue = OperationQueue.current?.name {
return "OperationQueue: \(currentOperationQueue)"
} else if let underlyingDispatchQueue = OperationQueue.current?.underlyingQueue?.label {
return "DispatchQueue: \(underlyingDispatchQueue)"
} else {
let name = __dispatch_queue_get_label(nil)
return String(cString: name, encoding: .utf8) ?? Thread.current.description
}
}
}
사용하는 방법:
print(Thread.current.threadName)
답변
GCD를 사용할 때 dispatchPrecondition 을 사용 하여 추가 실행에 필요한 디스패치 조건을 확인할 수 있습니다 . 올바른 스레드에서 코드 실행을 보장하려는 경우 유용 할 수 있습니다. 예를 들면 :
DispatchQueue.main.async {
dispatchPrecondition(condition: .onQueue(DispatchQueue.global())) // will assert because we're executing code on main thread
}