1

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

假设 ViewControllerOne 想要执行许多任务,每个任务都依赖于前一个任务的结果,那么在每个完成块执行后如何将这个控制权交还给 viewcontroller?

我开始考虑这个问题,我正朝着一个深度嵌套的块模式前进,这肯定只会让其他阅读或测试它的人感到困惑。

一个任务执行,完成块返回下一个任务所需的结果或错误,它有自己的完成任务,下一个任务依赖于等等。

如何在一个地方管理控件,即视图控制器?

完成块是否会使用指向正在调用它的视图控制器(self)的指针来调用处理下一个任务的下一个函数?

4

3 回答 3

2

你想要达到的目标对我来说有点不清楚,但你可以尝试类似的东西:

- (id)performBlocks:(NSArray *)blocks
{
    id state = [self initialState];

    for(id (^block)(id) in blocks)
    {
        state = block(state);

        // do something with state
    }

    return state;
}

由于每个块都依赖于前一个块的结果,因此您必须串行执行它们。您可以传递一个由每个块更新的状态对象,然后在对连续块的调用之间,您可以根据调用之间的状态进行任何处理。

于 2012-09-12T15:56:30.643 回答
1

这听起来像是 NSOperation 的依赖特性的理想用例。即,

- (void)addDependency:(NSOperation *)operation
- (void)removeDependency:(NSOperation *)operation

您可以使某些操作依赖于其他操作,因此您可以构建操作之间的依赖关系图。

于 2012-09-12T16:56:08.687 回答
1

您关于“将控制权”交还给 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);
  }
}
于 2012-09-12T21:29:50.483 回答