2016-09-18 2 views
16

У нас есть функция, как это в быстром 2.2 для печати сообщения журнала с текущей запущенной темой:Как получить текущее имя очереди в быстрых 3

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) 
    } 
} 

Этого код больше не компилировать в стремительной 3.0. Как получить имя очереди сейчас?


Вопрос задан вопрос о том, как определить, где две нити одинаковы нить или нет: Check if on correct dispatch queue in Swift 3. В принятом ответе предлагается использовать setSpecific для сопоставления «метки» с созданной очередью. Однако это не решает проблему, потому что мы хотим знать имя очереди. И очередь может не обязательно создаваться самим.

+2

Возможный дубликат [Проверьте на правильной очереди отправки в Swift 3] (http://stackoverflow.com/questions/37952262/check-if-on-correct -dispatch-queue-in-swift-3) – ozgur

ответ

22

Как Brent Royal-Gordon отметил в своем message на lists.swift.org это отверстие в текущем проекте, но вы можете использовать этот ужасный обходной путь.

func currentQueueName() -> String? { 
     let name = __dispatch_queue_get_label(nil) 
     return String(cString: name, encoding: .utf8) 
    } 
+4

Пожалуйста, отредактируйте с дополнительной информацией. Только код и «попробуйте» ответы не приветствуются, поскольку они не содержат содержимого, доступного для поиска, и не объясняют, почему кто-то должен «попробовать это». Мы прилагаем усилия, чтобы стать источником знаний. –

+2

Хорошо, я сделаю это. – Huralnyk

+0

К сожалению, это единственный ответ, который работает. –

4

Если вам не нравится небезопасные указатели и С-строка, есть другое, безопасное решение:

if let currentQueueLabel = OperationQueue.current?.underlyingQueue?.label { 
    print(currentQueueLabel) 
    // Do something... 
} 

Я не знаю ни одного случая, когда currentQueueLabel будет nil.

+0

Если очередь не создана самим собой, какова будет метка? И вы видели этот вопрос? https://stackoverflow.com/questions/37952262 Связано ли это? @kelin –

+0

1. Ярлык будет чем-то вроде «com.apple.main-thread». 2. Речь идет о тестировании, и это очень связано, но на ваш вопрос нет прямого ответа. – kelin

+0

Это решение работает неправильно. Для той же очереди 'OperationQueue.current ?.underlyingQueue? .label' возвращает« com.apple.main-thread », а' String (cString: __dispatch_queue_get_label (nil), encoding: .utf8) 'возвращает" myDispatchQueueLabel " – dodgio

0

Это работает лучше для меня:

/// 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 
     } 
    } 
} 
Смежные вопросы