如何检查Swift 3中的当前线程?

Bal*_*ick 89 multithreading nsthread ios swift3

如何检查哪一个是Swift 3中的当前线程?

在Swift的早期版本中,可以通过执行以下操作来检查当前线程是否是主要线程:

NSThread.isMainThread()
Run Code Online (Sandbox Code Playgroud)

Bal*_*ick 183

看起来它只是Thread.isMainThread在Swift 3中.


Bra*_*n A 90

Thread.isMainThread将返回一个布尔值,指示您当前是否在主UI线程上.但这不会给你当前的线程.它只会告诉你你是否在主要.

Thread.current 将返回您当前的线程.


nah*_*g89 17

斯威夫特 5+

通常,我们只需要知道代码被调度到哪个队列即可。所以我将threadName和分成queueName不同的属性以使其更清晰。

extension Thread {
    var threadName: String {
        if isMainThread {
            return "main"
        } else if let threadName = Thread.current.name, !threadName.isEmpty {
            return threadName
        } else {
            return description
        }
    }
    
    var queueName: String {
        if let queueName = String(validatingUTF8: __dispatch_queue_get_label(nil)) {
            return queueName
        } else if let operationQueueName = OperationQueue.current?.name, !operationQueueName.isEmpty {
            return operationQueueName
        } else if let dispatchQueueName = OperationQueue.current?.underlyingQueue?.label, !dispatchQueueName.isEmpty {
            return dispatchQueueName
        } else {
            return "n/a"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

用例:

DispatchQueue.main.async {
   print(Thread.current.threadName)
   print(Thread.current.queueName)
}
// main
// com.apple.main-thread
Run Code Online (Sandbox Code Playgroud)
DispatchQueue.global().async {
   print(Thread.current.threadName)
   print(Thread.current.queueName)
}
// <NSThread: 0x600001cd9d80>{number = 3, name = (null)}
// com.apple.root.default-qos
Run Code Online (Sandbox Code Playgroud)


Nik*_*Kov 15

我做了一个扩展来打印线程和队列:

extension Thread {
    class func printCurrent() {
        print("\r??: \(Thread.current)\r" + ": \(OperationQueue.current?.underlyingQueue?.label ?? "None")\r")
    }
}
Run Code Online (Sandbox Code Playgroud)

Thread.printCurrent()

结果将是:

??: <NSThread: 0x604000074380>{number = 1, name = main}
: com.apple.main-thread
Run Code Online (Sandbox Code Playgroud)


Max*_*hun 11

使用 GCD 时,您可以使用dispatchPrecondition检查进一步执行所需的调度条件。如果您想保证在正确的线程上执行代码,这会很有用。例如:

DispatchQueue.main.async {
    dispatchPrecondition(condition: .onQueue(DispatchQueue.global())) // will assert because we're executing code on main thread
}
Run Code Online (Sandbox Code Playgroud)


Suh*_*til 8

Swift 4及更高版本:

Thread.isMainThread返回Bool说明用户是否在主线程上,如果有人要打印队列/线程的名称,此扩展名将很有帮助

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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如何使用:

print(Thread.current.threadName)
Run Code Online (Sandbox Code Playgroud)

  • `__dispatch_queue_get_label` 不是 Swift stdlib 的一部分,它在 Apple 平台框架之外不可用。例如,无法在 Ubuntu 上调用它。 (2认同)

cod*_*tte 5

在最新的 Swift 4.0 ~ 4.2 中,我们可以使用Thread.current

请参阅返回表示当前执行线程的线程对象