for (NSObject *aObj in myObjectArray) {
[self doSomething:aObj
completion:^{
//Execute next aObj
}];
}
这是一个简单的for-in循环,它将NSObject
取出,然后将aObj传递给doSomething
,但doSomething
有一个参数,即一个完成,这是一个块....我得到的问题是......在前一个aObj
完成之前必须调用下一个aObj
。并且,在aObj
完成myObjectArray
之后,所有内容都已完成。它会完成。但是我应该在完成块中写什么?我很困惑。
模拟适应性:
- 如果
myObjectArray
有下一个aObj
myObjectArray
选择aObj
self
来电doSomething
- 当
醇>self
doSomething`完成时,将执行完成代码,返回步骤1.
答案 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
- 可能需要,因为您已将其传递到块中。