我想在后台操作完成时执行某些操作,我正在使用以下代码执行后台操作:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) { () -> Void in
//perform the background operation
})
但从不同的角度来看,我如何获得当前的后台操作并进行处理呢? 非常感谢:))
答案 0 :(得分:4)
通常不会获得当前的后台操作"。如果您想在后台操作完成时执行某些操作,通常只需将其放入块本身即可。例如,如果要在后台任务完成时更新UI(在主队列上),您可以执行以下操作:
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中也同样有效。
有关异步编程技术的更多信息,请参阅Concurrency Programming Guide。或者参考WWDC 2012 video - Asynchronous Design Patterns with Blocks, GCD, and XPC。
答案 1 :(得分:2)
最简单的方法是在当前块完成时调度另一个块但在主队列上。
只有在主队列上调度的块才能更新UI元素。如果您在主队列上调度一个块,它将像一个方法一样。如果您在另一个队列上调度一个块,使其在后台运行,然后在该块的末尾从第一个块中调用另一个块返回主队列,您将能够调用您想要的任何方法。主队列上的第二个块。
答案 2 :(得分:1)
目前没有'当前'后台操作。有任意多个同时进行,你传递的块被允许在dispatch_async
返回之前完成(例如你的线程被中断而有利于硬件中断或者只是另一个线程在从dispatch_async
返回之前获得优先级但是在将块放入调度队列之后;块在开始调度的线程开始和结束之前恢复。)
一旦您的操作完成,您可能只想dispatch_async
返回dispatch_get_main_queue()
。