Sto imparando a conoscere GCD di Apple e guardando il video Concurrent Programming With GCD in Swift 3.Differenza tra l'invio a una coda con `sync` e l'utilizzo di un oggetto di lavoro con un flag` .wait`?
Alle 16:00 in questo video, viene descritta una bandiera per DispatchWorkItem
chiamata .wait
, e la funzionalità e il diagramma mostrano entrambi esattamente quello che pensavo fosse lo myQueue.sync(execute:)
.
Quindi, la mia domanda è; qual è la differenza tra:
myQueue.sync { sleep(1); print("sync") }
E:
myQueue.async(flags: .wait) { sleep(1); print("wait") }
// NOTE: This syntax doesn't compile, I'm not sure where the `.wait` flag moved to.
// `.wait` Seems not to be in the DispatchWorkItemFlags enum.
Sembra come entrambi gli approcci bloccano il thread corrente mentre aspettano per la coda denominata a:
- Fine ogni attuale o prima lavoro (se seriale)
- Completare il blocco dato/oggetto di lavoro
La mia comprensione di questo deve essere fuori da qualche parte, cosa mi manca?
Grazie. Sembra che ti dia un po 'più granularità di controllo di 'sync' quindi. Cosa sta facendo 'dispatchMain()? – SimplGy
@SimplGy: https://developer.apple.com/reference/dispatch/1452860-dispatch_main. È necessario inserire nei programmi senza un runloop (come i programmi della riga di comando) per mantenere GCD in esecuzione. In un Playground ottieni lo stesso effetto (credo) con 'PlaygroundPage.current.needsIndefiniteExecution = true' (http://stackoverflow.com/questions/24058336/how-do-i-run-asynchronous-callbacks-in-playground) –
@MartinR Grazie! Una piccola domanda: cosa succede se il codice all'interno del blocco 'workItem' è asincrono? Ad esempio il '' precarico 'di SKTextureAtlas' (completionHandler:)'. Come possiamo assicurarci che 'workItem' aspetterà che il codice finisca e solo allora segnerà se stesso come completato? – damirstuhec