Ios 如果当前线程相同,如何传递块

Ios 如果当前线程相同,如何传递块,ios,swift,multithreading,thread-safety,dispatch-queue,Ios,Swift,Multithreading,Thread Safety,Dispatch Queue,我已经编写了一个类来处理DispatchQueues。我已经编写了一个静态方法来调用mainthread。我将一个completionHandler作为参数和当前值传递给只访问主线程的人,并在主线程块内调用这个完成处理程序。这会导致在多次并发调用此方法时挂起,因此我想检查主线程是否已调用此方法,因此我不应该调度队列,而只是调用完成处理程序,但当我调用此completionHandler时,它会进入其他线程,而不是作为主线程 class ETQueue: NSObject { static

我已经编写了一个类来处理
DispatchQueues
。我已经编写了一个静态方法来调用
main
thread。我将一个
completionHandler
作为参数和当前值传递给只访问主线程的人,并在主线程块内调用这个完成处理程序。这会导致在多次并发调用此方法时挂起,因此我想检查主线程是否已调用此方法,因此我不应该调度队列,而只是调用完成处理程序,但当我调用此
completionHandler
时,它会进入其他线程,而不是作为主线程

class ETQueue: NSObject {
    static func main(completion: @escaping()->()) {
        ETQueue.background {
            DispatchQueue.main.sync {
                completion()
            }
        }
    }
    static func main(_ deley: Double, completion: @escaping()->()) {
        ETQueue.background {
            DispatchQueue.main.asyncAfter(deadline: .now() + deley) {
                completion()
            }
        }
    }
    static func background(completion: @escaping()->()) {
        DispatchQueue.global(qos: .background).async {
            completion()
        }
    }
}
这是我的课

class ETQueue: NSObject {
    static func main(completion: @escaping()->()) {
        if Thread.isMainThread {
            // If current thread is main the i am calling the completion handler but execution of this completionHandler
            //Takes the thread to some other level.
            completion()
        }else {
            DispatchQueue.main.sync {
                completion()
            }
        }
    }
    static func main(_ deley: Double, completion: @escaping()->()) {
        DispatchQueue.main.asyncAfter(deadline: .now() + deley) {
            completion()
        }
    }
    static func background(completion: @escaping()->()) {
        DispatchQueue.global(qos: .background).async {
            completion()
        }
    }
}

对于你想要实现的目标,还有另一种方法。首先,您需要在后台线程上发送它,然后在主线程上再次分派

class ETQueue: NSObject {
    static func main(completion: @escaping()->()) {
        ETQueue.background {
            DispatchQueue.main.sync {
                completion()
            }
        }
    }
    static func main(_ deley: Double, completion: @escaping()->()) {
        ETQueue.background {
            DispatchQueue.main.asyncAfter(deadline: .now() + deley) {
                completion()
            }
        }
    }
    static func background(completion: @escaping()->()) {
        DispatchQueue.global(qos: .background).async {
            completion()
        }
    }
}

哇,这个解决方案奏效了。。。这有点棘手,但很简单。