ฉันจะตรวจสอบได้อย่างไรว่าอันไหนคือเธรดปัจจุบันใน Swift 3
ใน Swift เวอร์ชันก่อนหน้าคุณสามารถตรวจสอบได้ว่าเธรดปัจจุบันเป็นเธรดหลักหรือไม่โดยทำสิ่งนี้:
NSThread.isMainThread()
ฉันจะตรวจสอบได้อย่างไรว่าอันไหนคือเธรดปัจจุบันใน Swift 3
ใน Swift เวอร์ชันก่อนหน้าคุณสามารถตรวจสอบได้ว่าเธรดปัจจุบันเป็นเธรดหลักหรือไม่โดยทำสิ่งนี้:
NSThread.isMainThread()
คำตอบ:
ดูเหมือนว่าจะเป็นเพียงแค่Thread.isMainThread
ใน Swift 3
Thread.isMainThread
จะส่งคืนบูลีนที่ระบุว่าคุณอยู่ในเธรด UI หลักหรือไม่ แต่นี่จะไม่ทำให้คุณมีเธรดปัจจุบัน มันจะบอกคุณได้ว่าคุณอยู่บนหลักหรือไม่เท่านั้น
Thread.current
จะส่งคืนเธรดปัจจุบันที่คุณเปิดอยู่
ฉันได้สร้างส่วนขยายเพื่อพิมพ์เธรดและคิว:
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
Swift 4 ขึ้นไป:
Thread.isMainThread
ส่งกลับโดยBool
ระบุว่าหากผู้ใช้อยู่ใน Main Thread หรือไม่ในกรณีที่มีคนต้องการพิมพ์ชื่อของคิว / เธรดส่วนขยายนี้จะเป็นประโยชน์
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)
เมื่อใช้ GCD คุณสามารถใช้dispatchPreconditionเพื่อตรวจสอบเงื่อนไขการจัดส่งที่จำเป็นสำหรับการดำเนินการต่อไป สิ่งนี้จะมีประโยชน์หากคุณต้องการรับประกันการเรียกใช้โค้ดของคุณบนเธรดที่ถูกต้อง ตัวอย่างเช่น:
DispatchQueue.main.async {
dispatchPrecondition(condition: .onQueue(DispatchQueue.global())) // will assert because we're executing code on main thread
}
ใน Swift 4.0 ~ 4.2 ล่าสุดเราสามารถใช้ไฟล์ Thread.current
โปรดดูที่ส่งคืนอ็อบเจ็กต์เธรดที่แสดงเธรดปัจจุบันของการดำเนินการ
__dispatch_queue_get_label
ไม่ได้เป็นส่วนหนึ่งของ Swift stdlib ซึ่งไม่มีให้ใช้งานนอกกรอบงานแพลตฟอร์ม Apple เท่านั้น ไม่สามารถเรียกใช้บน Ubuntu ได้เช่น