代码之家  ›  专栏  ›  技术社区  ›  some_id

避免嵌套块

  •  1
  • some_id  · 技术社区  · 12 年前

    如果有视图控制器想要一次一个地执行多个基于块的任务,那么在完成块已经执行之后,如何将控制返回给视图控制器。

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

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

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

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

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

    3 回复  |  直到 12 年前
        1
  •  2
  •   attente    12 年前

    我不清楚你想要实现什么,但你可以尝试以下方式:

    - (id)performBlocks:(NSArray *)blocks
    {
        id state = [self initialState];
    
        for(id (^block)(id) in blocks)
        {
            state = block(state);
    
            // do something with state
        }
    
        return state;
    }
    

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

        2
  •  1
  •   David Hoerl    12 年前

    你关于“将控制权交还给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);
      }
    }
    
        3
  •  1
  •   Jody Hagins    12 年前

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

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

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

    推荐文章