0

Note: Ceci est reproduit pas question que je l'ai déjà vu Dispatch group - cannot notify to main threadDispatchWorkItem n'avisait pas thread principal

Il n'y a rien répondu au sujet DispatchWorkItem

J'ai le code comme ci-dessous

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) 

Ce qui est fonctionne correctement (je peux voir notifier sur la console) et pas dans le fil principal start DispatchWorkItem false

début DispatchWorkItem faux

fin DispatchWorkItem

informer

Maintenant, je suis en train de notifier au fil principal à l'aide

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

} 

Mais il appelle jamais, je lire et trouvé que si le fil est bloqué, la situation se produit s. mais je suis déjà exécutais DisptachWorkItem dans DispatchQueue.global()

S'il vous plaît quelqu'un peut me aider à ce que ce passe réellement?

enter image description here

+0

Votre code fonctionne pour moi avec 'dwi3.notify (queue: DispatchQueue.main)' dans un terrain de jeu et dans une application. Comment est-ce que vous exécutez le code – Paulw11

+0

Il est étrange que je viens d'ajouter du code dans le terrain de jeu, mais 'dwi3.notify (file d'attente: DispatchQueue.main)' ne fonctionne pas !! –

+0

Si vous courez dans un terrain de jeu, vous devez ajouter 'import PlaygroundSupport' et ' PlaygroundPage.current.needsIndefiniteExecution = true' – Paulw11

Répondre

1

Si vous utilisez le code asynchrone dans un terrain de jeu, vous devez activer l'exécution indéfinie, sinon l'exécution peut se terminer avant les callbacks exécuter.

Ajoutez les lignes suivantes à votre code dans la cour de récréation:

import PlaygroundSupport 
PlaygroundPage.current.needsIndefiniteExecution = true 

Une fois que vous faites cela, vous verrez que la notification correctement exécuté sur la file d'attente principale.