example dispatchqueue dispatch_async async swift grand-central-dispatch swift3 xcode8

dispatchqueue - nsoperationqueue swift 3 example



¿Debería activarse inmediatamente un `.barrier` en una cola simultánea? (1)

Este fue un error corregido en beta 6.

En la versión beta 5, no solo no se comporta de la manera .onQueueAsBarrier , sino que la .onQueueAsBarrier previa de .onQueueAsBarrier falla también. El problema parece estar .barrier con la opción .barrier , porque si lo realizas a través de la API Objective-C equivalente, dispatch_barrier_async , funciona bien, por ejemplo:

let q = DispatchQueue(label: "q", attributes: .concurrent) BarrierExperiment.dispatchBarrierAsync(q) { dispatchPrecondition(condition: .onQueueAsBarrier(q)) Thread.sleep(forTimeInterval: 0.25) print("A") } q.async() { print("B") }

Dónde

@interface BarrierExperiment : NSObject + (void)dispatchBarrierAsync:(dispatch_queue_t)queue block:(void (^)())block; @end @implementation BarrierExperiment + (void)dispatchBarrierAsync:(dispatch_queue_t)queue block:(void (^)())block { dispatch_barrier_async(queue, block); } @end

No estoy seguro si esto se rompió en xcode8 beta 5. Mire este código. ¿Crees que debería imprimir primero "A" o "B"?

let q = DispatchQueue(label: "q", attributes: .concurrent) q.async(flags: .barrier) { Thread.sleep(forTimeInterval: 0.25) print("A") } q.sync { print("B") }

Debido a .barrier , creo que debería bloquear la cola simultánea e imprimir "A", "B", pero no en la última versión beta de xcode.

¿Error? Malentendido de .barrier? ¿Qué piensas?

tenga en cuenta: sé que esto se imprimirá en el orden esperado si utilizo una cola en serie: esta es una pequeña parte de un sistema mucho más grande y necesito entender este comportamiento de forma aislada.