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.