如何在swift 3中获取当前队列名称

Yuc*_*ong 22 swift swift3

我们在swift 2.2中有这样的函数,用于使用当前运行的线程打印日志消息:

func MyLog(_ message: String) {
    if Thread.isMainThread {
        print("[MyLog]", message)
    } else {
        let queuename = String(UTF8String: dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL))! // Error: Cannot convert value of type '()' to expected argument type 'DispatchQueue?'
        print("[MyLog] [\(queuename)]", message)
    }
}
Run Code Online (Sandbox Code Playgroud)

这些代码不再在swift 3.0中编译.我们现在如何获得队列名称?


问题是如何识别两个线程在同一个线程中的位置:检查Swift 3中是否有正确的调度队列.接受的答案建议用于将setSpecific"标签"与创建的队列相关联.但是,这并不能解决问题,因为我们想知道队列名称.队列可能不一定是由我们自己创建的.

Hur*_*nyk 34

正如Brent Royal-Gordonlists.swift.org上的消息中提到的,它是当前设计中的一个漏洞,但你可以使用这个可怕的解决方法.

func currentQueueName() -> String? {
    let name = __dispatch_queue_get_label(nil)
    return String(cString: name, encoding: .utf8)
}
Run Code Online (Sandbox Code Playgroud)


kel*_*lin 7

如果你不喜欢不安全的指针和c-strings,还有另一个安全的解决方案:

if let currentQueueLabel = OperationQueue.current?.underlyingQueue?.label {
    print(currentQueueLabel)
    // Do something...
}
Run Code Online (Sandbox Code Playgroud)

我不知道任何情况下,当currentQueueLabelnil.

  • 这仅适用于专门为操作队列创建的调度队列,而且仅当这些调度队列当前处于活动状态时才会触发,因为它们的操作队列正在积极执行操作。如果不满足这些条件中的任何一个,您将获得一个“nil”标签。举个例子:你自己的调度队列,或者你自己的块提交到任何队列期间。 (3认同)

Eon*_*nil 3

现在 DispatchQueue 具有 label 属性

您在创建时分配给调度队列的标签。

var label: String { get } 
Run Code Online (Sandbox Code Playgroud)

它似乎从一开始就存在,可能没有通过公共 API 公开。

macOS 10.10+
Run Code Online (Sandbox Code Playgroud)

并且请仅使用它来获取人类可读的标签。不去识别每个GCDQ。

如果你想检查你的代码是否在某个GCDQ上运行,你可以使用dispatchPrecondition(...)函数