2

我写了一个类来处理DispatchQueues。我写了一个静态方法来调用main线程。我将 acompletionHandler作为参数传递,当前仅访问主线程并在主线程块内调用此完成处理程序。当这个方法被同时调用几次时,这会导致挂起,所以我想检查方法是否已经被主线程调用,那么我不应该调度队列而不是我只是调用完成处理程序但是当我调用它时completionHandler它会进入一些其他线程但不作为主线程。

这是我的课

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()
        }
    }
}
4

1 回答 1

1

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

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()
        }
    }
}
于 2018-03-22T08:34:21.673 回答