Вот пример того, как сделать это с блоками и одновременным перечислением:
NSArray *array1 = [NSArray arrayWithObjects:
[NSNumber numberWithInt:1],
[NSNumber numberWithInt:2],
[NSNumber numberWithInt:3],
[NSNumber numberWithInt:4],
nil];
NSArray *array2 = [NSArray arrayWithObjects:
[NSNumber numberWithInt:10],
[NSNumber numberWithInt:20],
[NSNumber numberWithInt:30],
[NSNumber numberWithInt:40],
nil];
NSMutableArray *resultArray = [[NSMutableArray alloc] initWithCapacity:[array1 count]];
for (int i=0; i<[array1 count]; i++) {
[resultArray addObject:[NSNull null]];
}
dispatch_queue_t resultArrayQueue = dispatch_queue_create("com.yourcompany.appname.resultsArrayQueue", DISPATCH_QUEUE_SERIAL);
[array1 enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
int num1 = [(NSNumber *)obj intValue];
int num2 = [[array2 objectAtIndex:idx] intValue];
NSNumber *result = [NSNumber numberWithInt:(num1 + num2)];
dispatch_async(resultArrayQueue, ^{
[resultArray replaceObjectAtIndex:idx withObject:result];
});
}];
NSLog(@"Result array: %@", resultArray);
Чтобы определить, быстрее это или нет, потребуется профилирование.Я догадываюсь, что это не намного быстрее и даже может быть медленнее из-за (относительно небольших, но все еще существующих) накладных расходов на отправку GCD.Однако для более сложных вычислений, чем для простого сложения, это дает вам представление о том, как использовать параллельное перечисление, чтобы легко что-то делать с каждым элементом массива многоядерным способом.
Если у вас было х числомассивы в массиве верхнего уровня (как описано в вашем комментарии), вы можете заменить -enumerateObjectsWithOptions: usingBlock: call чем-то вроде этого:
dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_apply(numberOfItemsInEachArray, globalQueue, ^(size_t idx) {
NSInteger sum = 0;
for (NSArray *array in parentArray) {
sum += [[array objectAtIndex:idx] integerValue];
}
NSNumber *result = [NSNumber numberWithInteger:sum];
dispatch_async(resultArrayQueue, ^{
[resultArray replaceObjectAtIndex:idx withObject:result];
});
});
dispatch_apply()
- это функция Grand Central Dispatch, которая простозапускает блок кода указанное количество раз.Поскольку мы говорим использовать глобальную параллельную очередь, которую мы получили с dispatch_get_global_queue()
, он может одновременно выполнять различные вызовы блока, обеспечивая (возможное) повышение производительности на многоядерных машинах.Как и в большинстве задач программирования, существует множество других способов решения этой проблемы.Это только то, что пришло мне в голову.