如果有一个视图控制器要一次执行多个基于块的任务,那么在完成一个完成块之后如何将控制权交还给视图控制器。

假设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/

10-09 07:07
查看更多