如何做这个回调块函数?

时间:2013-11-30 12:28:29

标签: objective-c loops for-loop foreach block

for (NSObject *aObj in myObjectArray) {
   [self doSomething:aObj
      completion:^{
      //Execute next aObj
   }];
}

这是一个简单的for-in循环,它将NSObject取出,然后将aObj传递给doSomething,但doSomething有一个参数,即一个完成,这是一个块....我得到的问题是......在前一个aObj完成之前必须调用下一个aObj。并且,在aObj完成myObjectArray之后,所有内容都已完成。它会完成。但是我应该在完成块中写什么?我很困惑。

模拟适应性:

  
      
  1. 如果myObjectArray有下一个aObj
  2.   
  3. myObjectArray选择aObj
  4.   
  5. self来电doSomething
  6.   
  7. self doSomething`完成时,将执行完成代码,返回步骤1.
  8.   

2 个答案:

答案 0 :(得分:1)

NSArray有一个方法enumerateObjectsWithOptions:usingBlock:,允许您指定一个选项,以便同时为每个对象执行块。也许这就是你要找的东西。

[array enumerateObjectsWithOptions:NSEnumerationConcurrent 
                        usingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    [self doSomething:obj];
    // completion
}];

答案 1 :(得分:1)

不清楚(直到你对DrummerB的回答发表评论)你真的想要顺序操作,而不是并发 - 循环用于顺序工作但在不同的线程中是不正常的(虽然我想你想要离开主要线程进行重处理。)

您可以使用NSOperationQueue完成此操作:

NSOperationQueue *queue = [[NSOperationQueue alloc] init];
for (__block NSObject *aObj in myObjectArray) {
    [queue addOperationWithBlock:^{
        [self doSomething:aObj
            completion:^{
               // nothing special here, since we wait after the operation is queued
             }];
    }];
    [queue waitUntilAllOperationsAreFinished];
}

请注意,我已将__block关键字添加到aObj - 可能需要,因为您已将其传递到块中。