Làm cách nào để kiểm tra xem cái nào là luồng hiện tại trong Swift 3?
Trong các phiên bản Swift trước, có thể kiểm tra xem luồng hiện tại có phải là luồng chính hay không bằng cách thực hiện điều này:
NSThread.isMainThread()
Làm cách nào để kiểm tra xem cái nào là luồng hiện tại trong Swift 3?
Trong các phiên bản Swift trước, có thể kiểm tra xem luồng hiện tại có phải là luồng chính hay không bằng cách thực hiện điều này:
NSThread.isMainThread()
Câu trả lời:
Có vẻ như nó chỉ đơn giản là Thread.isMainThread
trong Swift 3.
Tôi đã tạo một tiện ích mở rộng để in chuỗi và hàng đợi:
extension Thread {
class func printCurrent() {
print("\r⚡️: \(Thread.current)\r" + "🏭: \(OperationQueue.current?.underlyingQueue?.label ?? "None")\r")
}
}
Thread.printCurrent()
Kết quả sẽ là:
⚡️: <NSThread: 0x604000074380>{number = 1, name = main}
🏭: com.apple.main-thread
Swift 4 trở lên:
Thread.isMainThread
trả về thông Bool
báo rằng nếu người dùng đang ở trên Main Thread hay Không, trong trường hợp nếu ai đó muốn in tên của hàng đợi / thread, phần mở rộng này sẽ hữu ích
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
}
}
}
Cách sử dụng:
print(Thread.current.threadName)
Khi sử dụng GCD, bạn có thể sử dụng DispatchPrecondition để kiểm tra điều kiện điều phối cần thiết để thực hiện thêm. Điều này có thể hữu ích nếu bạn muốn đảm bảo mã của mình thực thi đúng luồng. Ví dụ:
DispatchQueue.main.async {
dispatchPrecondition(condition: .onQueue(DispatchQueue.global())) // will assert because we're executing code on main thread
}
Trong Swift 4.0 ~ 4.2 mới nhất, chúng ta có thể sử dụng Thread.current
Xem Trả về đối tượng luồng đại diện cho luồng thực thi hiện tại