如果有一个视图控制器要一次执行多个基于块的任务,那么在完成一个完成块之后如何将控制权交还给视图控制器。
假设ViewControllerOne想要执行多个任务,每个任务都依赖于上一个任务的结果,那么在每个完成块执行完之后,如何将这种控制权交还给ViewController?
我开始考虑这个问题,而我正朝着一个深层嵌套的块模式前进,这肯定只会给其他阅读或测试它的人造成混乱。
一个任务执行并且完成块返回下一个任务所需的结果或错误,下一个任务具有自己的完成任务,下一个任务所依赖的对象,依此类推。
如何在一个地方(即视图控制器)管理控件?
完成块是否会使用指向要在其中调用的视图控制器(自身)的指针来调用处理下一个任务的下一个函数?
最佳答案
您对将控制权交还给viewController(VC)的评论没有任何意义,因为VC通常在runLoop回调中处于阻塞状态,等待某些事情发生。
如果我了解您想要的内容,那么在发生所有这些事情时,它就有机会处理其他发送给VC的消息。定义一个方法:
{
NSMutableArray *blocks; // ivar
BOOL isCanceled;
}
typedef void (^block_t)(id input);
-(void)performBlock:(id)result;
一次创建所有块,也可以轻松创建,但是将它们添加到blocks数组中。每个块都有一个传递给它的对象,其中包含它需要的工作项。
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);
}
}
关于objective-c - 避免嵌套块,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12391767/