Простой пример последовательной очереди GCD, например, использование блоков FIFO - программирование
Подтвердить что ты не робот

Простой пример последовательной очереди GCD, например, использование блоков FIFO

Я прочитал документацию Apple о том, как использовать последовательные очереди, чтобы гарантировать выполнение задач в предсказуемом порядке, но теперь я слишком смущен. Некоторые, как я могу работать серийно, но все же я не ясен, поэтому мне нужен простой серийный пример для моих методов для серийного выполнения.

Я разделил свою функциональность на 4 части и теперь хочу, чтобы они выполнялись последовательно

[self ReadAllImagesFromPhotosLibrary];

[self WriteFewImagestoDirectory];

[self GettingBackAllImagesFromFolder]; 

[self MoveToNextView];
4b9b3361

Ответ 1

Чтобы отслеживать и улучшать iCoder, вы можете и должны сделать следующее.

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];
});

Несмотря на то, что вышеупомянутые вызовы async, они будут поставлены в очередь и запускаются серийно, как состояния DISPATCH_QUEUE_SERIAL. Разница между синхронимой и асинхронной заключается в том, что при синхронизации ваш код будет приостанавливаться и ждать ответа блока перед запуском следующего кода, что потенциально замораживая ваш интерфейс, если время выполнения длительное. Если async, код запускается, и блок возвращается асинхронно.

Однако задачи, которые вы сохранили в DISPATCH_QUEUE_SERIAL, будут ждать и выполняться один за другим в том порядке, в котором они были добавлены, благодаря GCD (Grand Central Dispatch).

Ответ 2

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];
                         });
                   });
              });
    }); 

Я думаю, что приведенный выше код должен работать, но убедитесь, что операции пользовательского интерфейса выполняются в основном потоке. Надеюсь, что это поможет.

Ответ 3

Вы можете использовать NSOperationQueue с maxConcurrentOperationCount, установленным в 1 (или даже установить зависимость для каждого NSOperation, чтобы он не запускался до завершения его зависимости).

Вот NSOperationQueue Ссылка на класс.

Также рассмотрите этот вопрос.

Ответ 4

Я не очень хорошо знаю существующий API для того, чтобы делать то же самое с блоками, если они есть.

Но то же самое можно сделать, определив блоки (представляющие операции, которые вы хотите) таким образом, чтобы они указывали на следующий блок, чтобы продолжить, если они есть. Кроме того, вы можете поместить всю обработку в отдельную очередь.

фрагмент для выполнения блоков в серийном режиме

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   
}  

Ответ 5

почему бы не попробовать GCD, он гарантирует последовательность операций, а также имеет возможности синхронизации и асинхронности.

Ответ 6

У меня был некоторый успех с подобным шаблоном в похожей охоте в 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()}