Получение текущей фоновой операции и ее обработка

Я хочу что-то сделать, когда фоновая операция завершена, для выполнения фоновой операции я использую следующий код:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) { () -> Void in
 //perform the background operation
})

но с другой точки зрения, как я могу получить текущую фоновый режим и обработать его? большое спасибо :)

3 ответа

Обычно нет "получения текущей фоновой операции". Если вы хотите что-то сделать, когда фоновая операция будет завершена, вы просто просто ставите ее в самом блоке. Например, если вы хотите обновить пользовательский интерфейс (в главной очереди), когда фоновая задача будет выполнена, вы сделаете что-то вроде:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
 // perform the background operation

 // now do whatever you want when the above is done

 dispatch_async(dispatch_get_main_queue(), ^{
 // do whatever you want here
 });
});

Если у вас есть серия блоков, которые вы отправили на задний план, и вы хотите дождаться завершения их завершения, вы обычно используете группу отправки:

dispatch_group_t group = dispatch_group_create();
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_queue_t notificationQueue = dispatch_get_main_queue();

dispatch_group_async(group, queue, ^{
 // do something
});

dispatch_group_async(group, queue, ^{
 // do something else
});

dispatch_group_notify(group, notificationQueue, ^{
 // whatever you want when the above dispatched blocks finish
});

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

NSOperationQueue *queue = [[NSOperationQueue alloc] init];
NSOperationQueue *completionQueue = [NSOperationQueue mainQueue];

NSOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{
 // do something
}];
[queue addOperation:operation1];

NSOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{
 // do something else
}];
[queue addOperation:operation2];

NSOperation *completionOperation = [NSBlockOperation blockOperationWithBlock:^{
 // whatever you want when the above operations finish
}];
[completionOperation addDependency:operation1];
[completionOperation addDependency:operation2];
[completionQueue addOperation:completionOperation];

Очевидно, что все приведенные выше примеры приведены в Objective-C, но общие шаблоны одинаково хорошо работают и в Swift.

Для получения дополнительной информации о методах асинхронного программирования см. Руководство по программированию параллельных вычислений. Или обратитесь к видео WWDC 2012 - асинхронные шаблоны проектирования с блоками, GCD и XPC.


Самый простой способ сделать это - отправить другой блок, но в основной очереди, когда текущий блок заканчивается.

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


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

Вероятно, вы просто хотите dispatch_async обратно в dispatch_get_main_queue() после завершения вашей операции.

licensed under cc by-sa 3.0 with attribution.