Как мне проверить, какой поток является текущим в Swift 3?

В предыдущих версиях Swift можно было проверить, является ли текущий поток основным, выполнив следующие действия:

NSThread.isMainThread()
132
BalestraPatrick 3 Сен 2016 в 17:06

6 ответов

Лучший ответ

Похоже, это просто Thread.isMainThread в Swift 3.

225
BalestraPatrick 3 Сен 2016 в 14:43

Swift 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)
20
Suhit Patil 26 Дек 2018 в 11:02

Thread.isMainThread вернет логическое значение, указывающее, находитесь ли вы в настоящее время в основном потоке пользовательского интерфейса. Но это не даст вам текущий поток. Он только скажет вам, на главной вы или нет.

Thread.current вернет текущий поток, в котором вы находитесь.

111
Brandon A 12 Янв 2017 в 20:33

Я сделал расширение для печати потока и очереди:

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
25
Nik Kov 3 Июл 2018 в 13:26

В последних версиях Swift 4.0 ~ 4.2 мы можем использовать Thread.current

См. Возвращает объект потока, представляющий текущий поток выполнения

1
code4latte 25 Сен 2018 в 08:12

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

DispatchQueue.main.async {
    dispatchPrecondition(condition: .onQueue(DispatchQueue.global())) // will assert because we're executing code on main thread
}
10
Maxim Makhun 29 Июн 2019 в 21:03