如评论中所述,最简单的解决方案是仅在最终任务完成时运行回调。然后,您可以按顺序调用所有任务的回调代码。即,如果需要,将对象添加到数组中,然后当回调中的增量计数器达到数组中的对象数时,执行回调代码。
如果回调是独立于对象的,那么您可以简单地使用计数器并在完成后运行代码。请记住在主线程中或使用“@sync()”指令运行任何计数器操作以避免竞争条件。
dispatch_async(dispatch_get_main_queue(), ^(void){ /* code*/ });
编辑:在完成处理程序中使用相同的数组技术,您将对象的标志设置为准备发送。然后尽可能遍历数组,依次发送所有准备好的对象。否则停止并等待下一个完成处理程序调用。您可以使用计数器来跟踪位置或在完成后从数组中删除项目,但请务必在主线程上或使用同步块进行。
@interface MyImage : NSImage
@property (assign) BOOL ready;
@end
@implementation MyImage
@synthesize ready;
- (void)send {
//Send image, make sure it's threaded send, NSConnection should be okay
}
@end
NSArray *imagesNeededToSend = [NSMutableArray arrayWithObjects:image1, image2, image3, nil];
dispatch_async(self.queue, ^{
// Long-running code here of varying complexity
dispatch_async(dispatch_get_main_queue(), ^{
self.ready = YES;
dispatch_async(dispatch_get_main_queue(), ^(void){ [self sendImages] });
});
});
...
- (void)sendImages {
MyImage *firstImage = [imagesNeededToSend firstObject]; //Xcode Beta, but you should have a a category for firstObject, very useful.
if (firstImage.ready) {
[firstImage send];
[imagesNeededToSend removeObjectAtIndex:0];
[self sendImages];
}
}