Check whether or not the current thread is the main thread

前端 未结 13 1045
北恋
北恋 2020-12-02 11:42

Is there any way to check whether or not the current thread is the main thread in Objective-C?

I want to do something like this.

  - (void)someMethod         


        
13条回答
  •  孤街浪徒
    2020-12-02 12:21

    Details

    • Swift 5.1, Xcode 11.3.1

    Solution 1. Detect any queue

    Get current DispatchQueue?

    Solution 2. Detect only main queue

    import Foundation
    
    extension DispatchQueue {
    
        private struct QueueReference { weak var queue: DispatchQueue? }
    
        private static let key: DispatchSpecificKey = {
            let key = DispatchSpecificKey()
            let queue = DispatchQueue.main
            queue.setSpecific(key: key, value: QueueReference(queue: queue))
            return key
        }()
    
        static var isRunningOnMainQueue: Bool { getSpecific(key: key)?.queue == .main }
    }
    

    Usage

    if DispatchQueue.isRunningOnMainQueue { ... }
    

    Sample

    func test(queue: DispatchQueue) {
        queue.async {
            print("--------------------------------------------------------")
            print("queue label: \(queue.label)")
            print("is running on main queue: \(DispatchQueue.isRunningOnMainQueue)")
        }
    }
    
    test(queue: DispatchQueue.main)
    sleep(1)
    test(queue: DispatchQueue.global(qos: .background))
    sleep(1)
    test(queue: DispatchQueue.global(qos: .unspecified))
    

    Result (log)

    --------------------------------------------------------
    queue label: com.apple.root.background-qos
    is running on main queue: false
    --------------------------------------------------------
    queue label: com.apple.root.default-qos
    is running on main queue: false
    --------------------------------------------------------
    queue label: com.apple.main-thread
    is running on main queue: true
    

提交回复
热议问题