software mac for descargar apple swift swift3

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 .