6

Gibt es eine Möglichkeit, den Thread oder die Warteschlange zu protokollieren, von der eine Methode ausgeführt wird? Etwas wie:Protokollieren, welche Queue/Thread eine Methode läuft

- (void)foo 
{ 
    NSLog(@"Running on %@ queue, %@ thread", queue, thread); 
} 
+0

'[NSThread currentThread]', wie gesehen [hier] (http://Stackoverflow.com/a/1616737/1971013). –

+0

http://Stackoverflow.com/a/5166740/1407017 & http://Stackoverflow.com/a/1542071/1407017 – Amar

+0

Dies kann helfen: http://Stackoverflow.com/a/30019141/1138755 – cromandini

Antwort

9

verwenden Sie können mit +[NSThread currentThread] den aktuellen Thread zu bekommen. Das könnte eine name Eigenschaft haben, aber wenn Sie nicht gesetzt haben, verlassen Sie sich nicht darauf.

Warteschlangen sind kniffliger, weil es verschiedene Bedeutungen von "Warteschlange" gibt. Eine Warteschlange könnte ein NSOperationQueue sein, und Sie können seine name von +[NSOperationQueue currentQueue] greifen (wieder, vorausgesetzt, Sie setzen es).

Dann gibt es Dispatch Queues. Sie können die aktuelle Warteschlange mit dispatch_get_current_queue() abrufen, aber seien Sie gewarnt, dass diese Funktion auch dann erfolgreich ist, wenn sie aus einem Code aufgerufen wird, der keiner Warteschlange (!) Zugeordnet ist. In diesem Fall gibt es die Standardhintergrundwarteschlange zurück. Warteschlangen sind beschriftet, so dass Sie dispatch_queue_get_label() aufrufen können und wenn Sie die Warteschlange mit einem Label erstellt haben, werden Sie das bekommen.

Also im Grunde, ja können Sie die Warteschlange oder Thread - mit der Maßgabe, dass alle Code hat eine zugeordnete Dispatch-Warteschlange, auch wenn es nicht Code, der ausgelöst wurde. Normalerweise erhalten Sie für diese Threads und Warteschlangen auch aussagekräftige Namen, was für das Debugging hilfreich ist. Es liegt jedoch in Ihrer Verantwortung, sie zu benennen.

+0

Großartige Informationen, Danke Graham. –

1

den Faden zu erhalten, können Sie

NSLog(@"Running on %@ thread", [NSThread currentThread]); 
1

Sie können die aktuelle Absende-Warteschlange wie diese:

dispatch_queue_t dispatch_get_current_queue(void); 

Doch der Kopf hat die folgenden Warnungen:

nur empfohlen für Debugging-Zwecke und Protokollierung:

Der Code muss Nicht machen irgendwelche Annahmen über die Warteschlange zurück, es sei denn, es ist eine der globalen Warteschlangen oder eine Warteschlange, die der Code selbst erstellt hat. Der Code muss nicht davon ausgehen, dass die synchrone Ausführung in einer Warteschlange vor Deadlock sicher ist, wenn diese Warteschlange nicht von dispatch_get_current_queue() zurückgegeben wird.

so YMMV.

2

Hier ist ein Swift-Code, den ich gerade verwende. Dies ist teilweise auf eine andere Antwort basierend ich bei Stack-Überlauf vorher hier gepostet: https://stackoverflow.com/a/41294559/253938

/// Struct to contain either the thread name or an (arbitrary) thread number for the current thread. 
/// This is partly inspired by code in BaseDestination.swift in XCGLogger. Main thread is 
/// arbitrarily given thread number 0. If no thread name can be determined then the memory address 
/// of the current Thread object is arbitrarily used as the thread number. 
/// 
/// Re use of "__dispatch_queue_get_label(nil)" (seen in XCGLogger) see here: 
/// https://stackoverflow.com/questions/40186868/get-gcd-label-in-swift-3 
internal struct ThreadInfo : CustomStringConvertible { 

    var threadName : String? = nil 
    var threadNumber : Int64? = nil 


    /// Initializer. 
    public init() { 
     // Process main thread (call it thread 0) and threads whose name can be determined 
     if Thread.isMainThread { 
     threadNumber = 0 
     } 
     else if let threadName = Thread.current.name, !threadName.isEmpty { 
     self.threadName = threadName 
     } 
     else if let queueName = String(validatingUTF8: __dispatch_queue_get_label(nil)), 
     !queueName.isEmpty { 
     threadName = queueName 
     } 
     else { 
     // Convert the memory address of the current Thread object into an Int64 and use it as the 
     // (arbitrary) thread number 
     let objPtr = Unmanaged.passUnretained(Thread.current).toOpaque() 
     let onePtr = UnsafeMutableRawPointer(bitPattern: 1)! // Absolute memory location 1 
     let rawAddress : Int64 = onePtr.distance(to: objPtr) + 1 // May include high-order bits 
     threadNumber = rawAddress % (256 * 1024 * 1024 * 1024) // Remove possible high-order bits 
     } 
    } 


    /// Method to implement CustomStringConvertible, returning either the thread name if possible or 
    /// else the (arbitrary) thread number. 
    public var description: String { 
     get { 
     return 
      threadName != nil ? String(describing: threadName!) : String(describing: threadNumber!) 
     } 
    } 
} 

Um dies zu verwenden nur Thread instanziiert, während auf dem Faden in Frage läuft. Dann können Sie ThreadInfo anzeigen oder in Protokolldaten einbetten.

let threadInfo = ThreadInfo() 
    print(threadInfo) 
Verwandte Themen