mac - Cómo obtener el nombre de la cola actual en swift 3
swift for mac download (4)
Como Brent Royal-Gordon mencionó en su message en lists.swift.org es un agujero en el diseño actual, pero puede usar esta solución horrible.
func currentQueueName() -> String? {
let name = __dispatch_queue_get_label(nil)
return String(cString: name, encoding: .utf8)
}
Tenemos una función como esta en Swift 2.2 para imprimir un mensaje de registro con el hilo actual:
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)
}
}
Estos códigos ya no se compilan en swift 3.0. ¿Cómo obtenemos el nombre de la cola ahora?
La pregunta que se hace sobre cómo identificar dónde están o no los dos subprocesos es el mismo o no: Compruebe si está en la cola de envío correcta en Swift 3 . La respuesta aceptada sugiere usar setSpecific
para asociar una "etiqueta" con una cola creada. Sin embargo, eso no resuelve el problema aquí porque queremos saber el nombre de la cola. Y la cola no necesariamente puede ser creada por nosotros mismos.
Este método funcionará tanto para la cola de operaciones como para la cola de despacho.
func printCurrnetQueueName()
{
print("Perform Operation /(String(describing: OperationQueue.current?.name!))")
}
Esto funciona mejor para mí:
/// The name/description of the current queue (Operation or Dispatch), if that can be found. Else, the name/description of the thread.
public func queueName() -> String {
if let currentOperationQueue = OperationQueue.current {
if let currentDispatchQueue = currentOperationQueue.underlyingQueue {
return "dispatch queue: /(currentDispatchQueue.label.nonEmpty ?? currentDispatchQueue.description)"
}
else {
return "operation queue: /(currentOperationQueue.name?.nonEmpty ?? currentOperationQueue.description)"
}
}
else {
let currentThread = Thread.current
return "UNKNOWN QUEUE on thread: /(currentThread.name?.nonEmpty ?? currentThread.description)"
}
}
public extension String {
/// Returns this string if it is not empty, else `nil`.
public var nonEmpty: String? {
if self.isEmpty {
return nil
}
else {
return self
}
}
}
Si no te gustan los punteros y las cadenas en C no seguros, existe otra solución segura:
if let currentQueueLabel = OperationQueue.current?.underlyingQueue?.label {
print(currentQueueLabel)
// Do something...
}
No conozco ningún caso en que currentQueueLabel
sea nil
.