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


107

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

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

NSThread.isMainThread()

Ответы:



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
}

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.