您关于“将控制权”交还给 viewController (VC) 的评论没有意义,因为 VC 通常被阻塞在 runLoop 回调中,等待某些事情发生。
如果我理解你想要什么,它就有机会在所有这些事情发生的同时处理其他发给 VC 的消息。定义一个方法:
{
NSMutableArray *blocks; // ivar
BOOL isCanceled;
}
typedef void (^block_t)(id input);
-(void)performBlock:(id)result;
一次创建所有块或从容地创建所有块,但将它们添加到块数组中。每个块都有一个传递给它的对象,其中包含它需要的工作项。:
block_t b = ^(id input) {
... do some work using input;
NSDictionary *dict = ....; // a possible result of the work
dispatch_async(dispatch_get_main_queue(), ^{ [self performBlock:dict; } );
};
第一个块被分派到某个队列 - 也可能是一个后台队列,并将其结果发送回 VC:
-(void)performBlock:(id)result
{
if(isCanceled) { // some other method set this flag
...
} else if([blocks count]) {
block_t b = [blocks objectAtIndex:0];
[blocks removeObjectAtIndex:0]; // guessing at method name
dispatch_async(some queue, b);
}
}