用于执行块数组的惯用法

时间:2014-08-07 18:36:17

标签: ios objective-c objective-c-blocks grand-central-dispatch

我有一个可以执行任意更新队列的对象。我使用块来体现更新。我使用addUpdate:方法添加更新。

- (void) addUpdate: (void(^)())block {
    [self.updates addObject: block];
}

后来,我想执行所有这些。我不在乎它们是否同时运行。基本的原始方式似乎是:

for (NSUInteger index = 0; index < self.updates.count; index++) {
    void (^block)() = self.updates[index];
    block();
}

或快速枚举

for (void (^block)() in self.updates) {
    block();
}

或者我是否应该采用GCD来实现这一目标?

2 个答案:

答案 0 :(得分:4)

我能想到的最简洁的方法是:

[self.updates makeObjectsPerformSelector: @selector(invoke)];

“惯用语”如何可能与情况有关...

编辑:这取决于块在运行时作为Objective-C对象实现的事实,并响应选择器-invoke。换句话说,表达式block();也可以表示为[block invoke];。我不知道有任何更简洁的方法来执行一个块数组。

答案 1 :(得分:2)

对于非并发执行,for-in是可行的方法。对于并发执行,您可以使用NSArray的-enumerateUsing ...方法并传递并发标志,或使用dispatch_apply()而不是循环。