我们在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-Gordon在lists.swift.org上的消息中提到的,它是当前设计中的一个漏洞,但你可以使用这个可怕的解决方法.
func currentQueueName() -> String? {
let name = __dispatch_queue_get_label(nil)
return String(cString: name, encoding: .utf8)
}
Run Code Online (Sandbox Code Playgroud)
如果你不喜欢不安全的指针和c-strings,还有另一个安全的解决方案:
if let currentQueueLabel = OperationQueue.current?.underlyingQueue?.label {
print(currentQueueLabel)
// Do something...
}
Run Code Online (Sandbox Code Playgroud)
我不知道任何情况下,当currentQueueLabel会nil.
您在创建时分配给调度队列的标签。
var label: String { get }
Run Code Online (Sandbox Code Playgroud)
它似乎从一开始就存在,可能没有通过公共 API 公开。
macOS 10.10+
Run Code Online (Sandbox Code Playgroud)
并且请仅使用它来获取人类可读的标签。不去识别每个GCDQ。
如果你想检查你的代码是否在某个GCDQ上运行,你可以使用dispatchPrecondition(...)函数。
| 归档时间: |
|
| 查看次数: |
10665 次 |
| 最近记录: |