Як перевірити поточну нитку в Swift 3?


105

Як перевірити, яка з них є поточною ниткою в Swift 3?

У попередніх версіях Swift можна було перевірити, чи поточна нитка була основною, виконавши це:

NSThread.isMainThread()

Відповіді:



106

Thread.isMainThreadповерне булеве значення із зазначенням того, що ви зараз перебуваєте на головному потоці інтерфейсу користувача. Але це не дасть тобі поточної нитки. Це скаже лише вам, чи є ви в основному чи ні.

Thread.current поверне поточну нитку, на якій ви перебуваєте.


24

Я зробив розширення для друку нитки та черги:

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

Thread.printCurrent()

Результатом буде:

⚡️: <NSThread: 0x604000074380>{number = 1, name = main}
🏭: com.apple.main-thread

17

Швидкий рух 4 і вище:

Thread.isMainThreadповертає, Boolзаявляючи, що якщо користувач перебуває на головній темі чи ні, у випадку, якщо хтось хоче надрукувати ім'я черги / нитки, це розширення буде корисним

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

Як використовувати:

print(Thread.current.threadName)

9

Під час використання GCD ви можете використовувати dispatchPrecondition, щоб перевірити умови відправки, необхідні для подальшого виконання. Це може бути корисно, якщо ви хочете гарантувати виконання коду на правильній темі. Наприклад:

DispatchQueue.main.async {
    dispatchPrecondition(condition: .onQueue(DispatchQueue.global())) // will assert because we're executing code on main thread
}

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.