如何处理数组IN PARALLEL

时间:2011-01-03 20:56:36

标签: iphone cocoa

因此,有很多方法可以通过选择器或代码块运行数组的所有元素。 makeObjectsPerformSelector:以及更多

如果您手头有4个或16个核心,您可能希望将所有处理发送到不同的进程。

即使在iOS上,将它们全部发送出去也是明智之举,或者至少让它们以风的方式完成。

在可可环境中做到这一点的最佳和最好的方式是什么?

同样,如果您希望将它们发送到任何时间完成,即 在执行以下指令之前不等待枚举完成 。 ..?

2 个答案:

答案 0 :(得分:10)

如果您想要并发和同步行为(即,在执行以下指令之前等待枚举完成),-[NSArray enumerateObjectsWithOptions:usingBlock:]将在您通过NSEnumerationConcurrent选项时执行此操作。此方法适用于Mac OS 10.6+和iOS 4.0 +。

如果您想要异步行为,可以使用标准多线程解决方案之一,例如NSOperation或GCD与-enumerateObjectsWithOptions:usingBlock:结合使用。例如,

dispatch_async(dispatch_get_global_queue(0, 0), ^{
    [array enumerateObjectsWithOptions:NSEnumerationConcurrent
        usingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
            // do something with obj
        }];
    });

答案 1 :(得分:9)

如果您可以定位iOS 4+或Mac OS X 10.6+,请使用Grand Central Dispatch(我使用的是类别,因为我觉得它们很酷):

#import <dispatch/dispatch.h>

@interface NSArray (DDAsynchronousAdditions)

- (void) makeObjectsPerformSelectorAsynchronously:(SEL)selector;
- (void) makeObjectsPerformSelectorAsynchronously:(SEL)selector withObject:(id)object;

@end

@implementation NSArray (DDAsynchronousAdditions)

- (void) makeObjectsPerformSelectorAsynchronously:(SEL)selector {
  [self makeObjectsPerformSelectorAsynchronously:selector withObject:nil];
}

- (void) makeObjectsPerformSelectorAsynchronously:(SEL)selector withObject:(id)object {
  for (id element in self) {
    dispatch_async(dispatch_get_global_queue(0,0), ^{
      [element performSelector:selector withObject:object];
    });
  }
}

@end

//elsewhere:

[myArray makeObjectsPerformSelectorAsynchronously:@selector(doFoo)];

或者,如果您不想使用类别......

[myArray enumerateObjectsUsingBlock:^(id obj, NSUInteger index, BOOL * stop) {
  dispatch_async(dispatch_get_global_queue(0,0), ^{
    [obj performSelector:@selector(doFoo)];
  };
}];