DispatchWorkItem не уведомляет основной поток

Примечание. Это не повторяющийся вопрос, который я уже видел. тема

Нет ответа о DispatchWorkItem

У меня есть код, как показано ниже

let dwi3 = DispatchWorkItem {
    print("start DispatchWorkItem \(Thread.isMainThread)")
    sleep(2)
    
    print("end DispatchWorkItem")
}
let myDq = DispatchQueue(label: "A custom dispatch queue")
dwi3.notify(queue: myDq) {
    print("notify")

}
DispatchQueue.global().async(execute: dwi3)

Который работает правильно (я вижу уведомление на консоли), а не в основном потоке start DispatchWorkItem false

запустить DispatchWorkItem false

конец DispatchWorkItem

уведомлять

Теперь я пытаюсь уведомить основной поток, используя

dwi3.notify(queue: DispatchQueue.main) {
    print("notify")

}

Но он никогда не вызывает, я прочитал и обнаружил, что если Thread заблокирован, возникает ситуация. но я уже выполняю DisptachWorkItem в DispatchQueue.global()

Пожалуйста, кто-нибудь может помочь мне в этом, что на самом деле происходит?

введите здесь описание изображения


person Prashant Tukadiya    schedule 29.09.2017    source источник
comment
Ваш код работает для меня с dwi3.notify(queue: DispatchQueue.main) как на игровой площадке, так и в приложении. Как вы запускаете код   -  person Paulw11    schedule 29.09.2017
comment
Странно, я только что добавил код на площадку, но `dwi3.notify(queue: DispatchQueue.main)` не работает!!   -  person Prashant Tukadiya    schedule 29.09.2017
comment
Если вы бегаете на игровой площадке, вы должны добавить import PlaygroundSupport и PlaygroundPage.current.needsIndefiniteExecution = true   -  person Paulw11    schedule 29.09.2017
comment
@ Paulw11 Я добавил снимок экрана   -  person Prashant Tukadiya    schedule 29.09.2017
comment
sleep(80) заблокирует основную очередь. Избавьтесь от него и добавьте две строчки из моего предыдущего комментария.   -  person Paulw11    schedule 29.09.2017
comment
@Paulw11 Спасибо, после добавления import PlaygroundSupport and PlaygroundPage.current.needsIndefiniteExecution = true теперь я вижу notify   -  person Prashant Tukadiya    schedule 29.09.2017


Ответы (1)


Если вы запускаете асинхронный код на игровой площадке, вам необходимо включить неопределенное выполнение, иначе выполнение может завершиться до выполнения обратных вызовов.

Добавьте следующие строки в свой код на игровой площадке:

import PlaygroundSupport
PlaygroundPage.current.needsIndefiniteExecution = true

Как только вы это сделаете, вы увидите, что уведомление правильно выполняется в основной очереди.

person Paulw11    schedule 29.09.2017
comment
Используйте sleep, но не повезло - person towry; 15.11.2018