Bagaimana cara memeriksa utas saat ini di Swift 3?

105

Bagaimana cara memeriksa utas mana yang saat ini di Swift 3?

Di versi Swift sebelumnya, dimungkinkan untuk memeriksa apakah utas saat ini adalah yang utama dengan melakukan ini:

NSThread.isMainThread()
BalestraPatrick
sumber

Jawaban:

215

Sepertinya hanya Thread.isMainThreaddi Swift 3.

BalestraPatrick
sumber
106

Thread.isMainThreadakan mengembalikan boolean yang menunjukkan jika Anda saat ini berada di utas UI utama. Tetapi ini tidak akan memberi Anda utas saat ini. Ini hanya akan memberi tahu Anda jika Anda berada di utama atau tidak.

Thread.current akan mengembalikan utas saat ini tempat Anda berada.

Brandon A
sumber
24

Saya telah membuat ekstensi untuk mencetak utas dan antrian:

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

Thread.printCurrent()

Hasilnya adalah:

⚡️: <NSThread: 0x604000074380>{number = 1, name = main}
🏭: com.apple.main-thread
Nik Kov
sumber
17

Swift 4 ke atas:

Thread.isMainThreadkembali Boolmenyatakan bahwa jika pengguna berada di Utas Utama atau Tidak, dalam kasus jika seseorang ingin mencetak nama antrian / utas ekstensi ini akan membantu

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
        }
    }
}

Cara Penggunaan:

print(Thread.current.threadName)
Suhit Patil
sumber
9

Saat menggunakan GCD, Anda dapat menggunakan dispatchPrecondition untuk memeriksa kondisi pengiriman yang diperlukan untuk eksekusi lebih lanjut. Ini dapat berguna jika Anda ingin menjamin eksekusi kode Anda pada utas yang benar. Sebagai contoh:

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