Как передать блок, если текущий поток такой же

Я написал класс для обработки DispatchQueues. Я написал статический метод для вызова потока main. Я передаю completionHandler в качестве аргумента, а текущий просто обращается к основному потоку и вызывает этот обработчик завершения внутри основного блока потока. Это вызывает зависание, когда этот метод вызывается несколько раз одновременно, поэтому я хочу проверить, вызывается ли метод уже основным потоком, тогда я не должен отправлять очередь, а не просто вызывать обработчик завершения, но когда я вызываю этот 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()
        }
    }
}

person Syed Qamar Abbas    schedule 22.03.2018    source источник


Ответы (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()
        }
    }
}
person Muhammad Umair    schedule 22.03.2018
comment
Вау, это решение сработало ... Это довольно сложный, но простой подход. - person Syed Qamar Abbas; 22.03.2018