Jak sprawdzić aktualny wątek w Swift 3?

105

Jak sprawdzić, który z nich jest bieżącym wątkiem w Swift 3?

W poprzednich wersjach Swifta można było sprawdzić, czy bieżący wątek jest głównym wątkiem, wykonując następujące czynności:

NSThread.isMainThread()
BalestraPatrick
źródło

Odpowiedzi:

215

Wygląda na to, że jest po prostu Thread.isMainThreadw Swift 3.

BalestraPatrick
źródło
106

Thread.isMainThreadzwróci wartość logiczną wskazującą, czy aktualnie znajdujesz się w głównym wątku interfejsu użytkownika. Ale to nie da ci aktualnego wątku. Powie ci tylko, czy jesteś na głównym, czy nie.

Thread.current zwróci bieżący wątek, w którym się znajdujesz.

Brandon A.
źródło
24

Zrobiłem rozszerzenie do drukowania wątku i kolejki:

extension Thread {
    class func printCurrent() {
        print("\r⚡️: \(Thread.current)\r" + "🏭: \(OperationQueue.current?.underlyingQueue?.label ?? "None")\r")
    }
}

Thread.printCurrent()

Wynik byłby taki:

⚡️: <NSThread: 0x604000074380>{number = 1, name = main}
🏭: com.apple.main-thread
Nik Kov
źródło
17

Swift 4 i nowsze:

Thread.isMainThreadzwraca z informacją Bool, że jeśli użytkownik jest w wątku głównym lub nie, w przypadku, gdy ktoś chce wydrukować nazwę kolejki / wątku to rozszerzenie będzie pomocne

extension Thread {

    var threadName: String {
        if let currentOperationQueue = OperationQueue.current?.name {
            return "OperationQueue: \(currentOperationQueue)"
        } else if let underlyingDispatchQueue = OperationQueue.current?.underlyingQueue?.label {
            return "DispatchQueue: \(underlyingDispatchQueue)"
        } else {
            let name = __dispatch_queue_get_label(nil)
            return String(cString: name, encoding: .utf8) ?? Thread.current.description
        }
    }
}

Jak używać:

print(Thread.current.threadName)
Suhit Patil
źródło
9

Korzystając z GCD, możesz użyć metody dispatchPrecondition, aby sprawdzić warunek wysyłki niezbędny do dalszego wykonania. Może to być przydatne, jeśli chcesz zagwarantować wykonanie kodu we właściwym wątku. Na przykład:

DispatchQueue.main.async {
    dispatchPrecondition(condition: .onQueue(DispatchQueue.global())) // will assert because we're executing code on main thread
}
Maxim Makhun
źródło