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

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

NSThread.isMainThread()

Ответы (7)

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

Swift 5 +

Обычно нам нужно только знать, в какую очередь отправляется код. Поэтому я разделяю threadName и queueName на разные свойства, чтобы сделать его более понятным.

extension Thread {
    var threadName: String {
        if isMainThread {
            return "main"
        } else if let threadName = Thread.current.name, !threadName.isEmpty {
            return threadName
        } else {
            return description
        }
    }
    
    var queueName: String {
        if let queueName = String(validatingUTF8: __dispatch_queue_get_label(nil)) {
            return queueName
        } else if let operationQueueName = OperationQueue.current?.name, !operationQueueName.isEmpty {
            return operationQueueName
        } else if let dispatchQueueName = OperationQueue.current?.underlyingQueue?.label, !dispatchQueueName.isEmpty {
            return dispatchQueueName
        } else {
            return "n/a"
        }
    }
}

Примеры использования:

DispatchQueue.main.async {
   print(Thread.current.threadName)
   print(Thread.current.queueName)
}
// main
// com.apple.main-thread
DispatchQueue.global().async {
   print(Thread.current.threadName)
   print(Thread.current.queueName)
}
// {number = 3, name = (null)}
// com.apple.root.default-qos

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

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

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

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

Thread.printCurrent ()

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

⚡️: {number = 1, name = main}
🏭: com.apple.main-thread

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

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

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

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

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)

2022 WebDevInsider