ios objective-c-blocks grand-central-dispatch

ios - Ejemplo de cola de serie GCD simple como FIFO utilizando bloques



objective-c-blocks grand-central-dispatch (6)

Leí la documentación de Apple sobre cómo usar colas en serie para garantizar que las tareas se ejecuten en un orden predecible, pero ahora estoy demasiado confundido.
Algunos cómo puedo trabajar en serie pero aún no estoy claro, así que necesito un ejemplo simple en serie para que mis métodos se ejecuten en serie.

Dividí mi funcionalidad en 4 partes y ahora quiero que se ejecuten en serie

[self ReadAllImagesFromPhotosLibrary]; [self WriteFewImagestoDirectory]; [self GettingBackAllImagesFromFolder]; [self MoveToNextView];


¿Por qué no probar el GCD? Garantiza la secuencia de operación y también tiene capacidades de sincronización y asíncrona.


No soy muy consciente de la API existente para hacer lo mismo con los bloques, si los hay.

Pero lo mismo se puede hacer definiendo los bloques (que representan las operaciones que desea) de manera que apunten al siguiente bloque para proceder, si corresponde. Además, puede poner todo el procesamiento en una cola separada.

Fragmento para tener bloques ejecutándose en forma serial.

BLOCK A(NEXT BLOCK reference){ ->Do the the required Task ->If(next Block reference) --->Then call that block ->Else --->Exit or have a callback on mainthread }


Para dar seguimiento y mejorar la respuesta de iCoder , puede y debe hacer lo siguiente.

dispatch_queue_t serialQueue = dispatch_queue_create("com.unique.name.queue", DISPATCH_QUEUE_SERIAL); dispatch_async(serialQueue, ^{ [self ReadAllImagesFromPhotosLibrary]; }); dispatch_async(serialQueue, ^{ [self WriteFewImagestoDirectory]; }); dispatch_async(serialQueue, ^{ [self GettingBackAllImagesFromFolder]; }); dispatch_async(serialQueue, ^{ [self MoveToNextView]; });

A pesar de que las llamadas anteriores son asíncronas , se pondrán en cola y se ejecutarán en serie como indica DISPATCH_QUEUE_SERIAL . La diferencia entre sincronización y asíncrono es que con la sincronización , su código se detendrá y esperará la respuesta del bloque antes de ejecutar el siguiente código, lo que potencialmente congelará su IU si el tiempo de ejecución es largo. Mientras que con async , el código se ejecuta y el bloque se devuelve de forma asíncrona .

Sin embargo, las tareas que haya almacenado en DISPATCH_QUEUE_SERIAL esperarán y se ejecutarán una después de la otra en el orden en que se agregaron, gracias a GCD (Grand Central Dispatch).


Puede usar NSOperationQueue con maxConcurrentOperationCount establecido en 1 (o incluso establecer la dependencia para cada NSOperation, por lo que no se iniciará antes de que finalice su dependencia).

Aquí está NSOperationQueue Class Reference.

También eche un vistazo a this pregunta.


Tuve algunos éxitos con un patrón como este en una búsqueda similar en Swift 3.0 ...

let serialQueue = DispatchQueue.init(label: "com.foo.bar") serialQueue.sync {self.readAllImagesFromPhotosLibrary()} serialQueue.sync {self.rriteFewImagestoDirectory()} serialQueue.sync {self.gettingBackAllImagesFromFolder()} serialQueue.sync {self.moveToNextView()}


dispatch_queue_t serialQueue = dispatch_queue_create("com.unique.name.queue", DISPATCH_QUEUE_SERIAL); dispatch_async(serialQueue, ^{ [self ReadAllImagesFromPhotosLibrary]; dispatch_async(serialQueue, ^{ [self WriteFewImagestoDirectory]; dispatch_async(serialQueue, ^{ [self GettingBackAllImagesFromFolder]; dispatch_async(serialQueue, ^{ [self MoveToNextView]; }); }); }); });

Creo que el código anterior debería funcionar, pero asegúrese de que las operaciones de la interfaz de usuario se ejecuten en el hilo principal. Espero eso ayude.