2016-10-21 3 views
1

ich einen Code haben, der zur Protokollierung das Etikett der aktuellen GCD Warteschlange erhält, die 2 in Swift sieht wie folgt aus:Get GCD-Label in Swift 3

if let queueName 
    = String(UTF8String: dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL)) where !queueName.isEmpty { 
    detailedMessage += "[" + queueName + "] " 
} 

Nach Xcode 8, dies zu Swift 3 umgewandelt , sieht es wie folgt aus:

if let queueName 
    = String(validatingUTF8: DISPATCH_CURRENT_QUEUE_LABEL.label), !queueName.IsEmpty { 
    detailedMessage += "[" + queueName + "] " 
} 

jedoch Xcode mir die folgende Fehlermeldung gibt, wenn ich bauen:

Wert des Tupels Typ '()' hat kein Mitglied 'label'

Ich habe keine Möglichkeit gefunden, das aktuelle Queue-Label in Swift 3 zu erhalten. Kann jemand helfen?

Danke,
David

AKTUALISIERT Hier kann die Funktion für Kontext ist:

public func log(_ message: String, 
       tag: String, 
       level: Logger.LogLevel, 
       userInfo: [String : String]?, 
       functionName: StaticString, 
       fileName: StaticString, 
       lineNumber: Int) { 

    var detailedMessage = "" 

    let formattedDate = self._dateFormatter.string(from: Date()) 
    detailedMessage += "\(formattedDate) " 

    detailedMessage += "[\(level.description)] " 

    if Thread.isMainThread { 
     detailedMessage += "[main] " 
    } else { 
     if let threadName = Thread.current.name , !threadName.isEmpty { 
      detailedMessage += "[" + threadName + "] " 
     } else if let queueName 
      = String(validatingUTF8: DISPATCH_CURRENT_QUEUE_LABEL.label) , !queueName.isEmpty { 
      detailedMessage += "[" + queueName + "] " 
     } else { 
      detailedMessage += "[" + String(format:"%p", Thread.current) + "] " 
     } 
    } 

    let lastPathComponent = NSString(stringLiteral: fileName).lastPathComponent 
    detailedMessage += "[" + lastPathComponent + ":" + String(lineNumber) + "] " 

    detailedMessage += "\(functionName) " 

    let fullMessage = self.messageWithTag(tag, message: message) 
    detailedMessage += "> \(fullMessage)" 

    NSLog("\(fullMessage)") 
} 
+0

Giv verwenden können de 'DISPATCH_CURRENT_QUEUE_LABEL' ist' NULL', es scheint, dass Sie 'String (validierenUTF8: __dispatch_queue_get_label (nil))' tun können. Aber das gibt mir die Willis. – Rob

+0

@Rob Danke. Das funktioniert, aber ich stimme dir zu. Wenn sich herausstellt, dass es sich um eine private API handelt, werden wir wahrscheinlich unzufrieden sein, wenn wir versuchen, unsere App einzureichen. –

+0

Da "dispatch_queue_get_label" und "DISPATCH_CURRENT_QUEUE_LABEL" beide dokumentiert sind, ist dies wahrscheinlich nur ein Versehen von Apple. Sie sollten unter https://bugreport.apple.com einen Fehler melden. –

Antwort

0

Sie diese Methode

let cName = __dispatch_queue_get_label(nil) 
let name = String(cString: cName, encoding: .utf8)