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()

Jawaban:



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.


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

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)

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
}

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.