Как проверить текущий поток в Swift 3?

107

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

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

NSThread.isMainThread()
БалестраПатрик
источник

Ответы:

217

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

БалестраПатрик
источник
108

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
Ник Ков
источник
18

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)
Сухит Патил
источник
__dispatch_queue_get_labelне является частью Swift stdlib, он недоступен за пределами платформ Apple. Например, в Ubuntu это не назовешь.
Ксандер Данн,
9

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

DispatchQueue.main.async {
    dispatchPrecondition(condition: .onQueue(DispatchQueue.global())) // will assert because we're executing code on main thread
}
Максим Махун
источник