Làm thế nào để kiểm tra luồng hiện tại trong Swift 3?


105

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:



106

Thread.isMainThreadsẽ trả về boolean cho biết bạn hiện đang ở trên chuỗi giao diện người dùng chính. Nhưng điều này sẽ không cung cấp cho bạn luồng hiện tại. Nó sẽ chỉ cho bạn biết nếu bạn đang ở trên chính hay không.

Thread.current sẽ trả về chủ đề hiện tại mà bạn đang truy cập.


24

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

17

Swift 4 trở lên:

Thread.isMainThreadtrả về thông Boolbá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)

9

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
}

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.