Подтвердить что ты не робот

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

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

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

NSThread.isMainThread()
4b9b3361

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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)

Ответ 6

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

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