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()
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:
Sepertinya hanya Thread.isMainThread
di Swift 3.
Thread.isMainThread
akan 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.
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
Swift 4 ke atas:
Thread.isMainThread
kembali Bool
menyatakan 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)
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
}
Di Swift 4.0 ~ 4.2 terbaru, bisa kita gunakan Thread.current
Lihat Mengembalikan objek utas yang mewakili utas eksekusi saat ini