Grand Central Dispatch Петрусь А.С., iOS-developer, MadAppGang Рыночная доля iOS-устройств (2013) GCD - низкоуровневое API для параллельного программирования. Преимущества использования Простота использования Эффективность Производительность Очереди Передача заданий в очередь Пример 1 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE _PRIORITY_DEFAULT, 0), ^{ [self goDoSomethingLongAndInvolved]; NSLog(@"Done doing something long and involved"); }); Передача заданий в очередь Пример 2 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE _PRIORITY_DEFAULT, 0), ^{ [self goDoSomethingLongAndInvolved]; dispatch_async(dispatch_get_main_queue(), ^{ [textField setStringValue:@"Done doing something long and involved"]; }); }); Передача заданий в очередь Пример 3. Блочные переменные __block NSString *stringValue; dispatch_sync(dispatch_get_main_queue(), ^{ stringValue = [[textField stringValue] copy]; }); [stringValue autorelease]; Передача заданий в очередь Пример 4 dispatch_queue_t bgQueue = myQueue; dispatch_async(dispatch_get_main_queue(), ^{ NSString *stringValue = [[[textField stringValue] copy] autorelease]; dispatch_async(bgQueue, ^{ // use stringValue in the background now }); }); Глобальные очереди Глобальные очереди Исходный цикл: for(id obj in array) { [self doSomethingIntensiveWith:obj]; } Параллельное представление (при условии потокозащищенности метода doSomethingIntensiveWith:obj): dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); for(id obj in array) { dispatch_async(queue, ^{ [self doSomethingIntensiveWith:obj]; }); } Глобальные очереди. Использование групп. Пример 1 dispatch_queue_t queue = dispatch_get_global_qeueue(DISPATCH_QUEUE_PRIORITY_DEFAUL T, 0); dispatch_group_t group = dispatch_group_create(); for(id obj in array) { dispatch_group_async(group, queue, ^{ [self doSomethingIntensiveWith:obj]; }); } dispatch_group_wait(group, DISPATCH_TIME_FOREVER); dispatch_release(group); [self doSomethingWith:array]; Глобальные очереди. Использование групп. Пример 2 dispatch_queue_t queue = dispatch_get_global_qeueue(DISPATCH_QUEUE_PRIORITY_DEFAUL T, 0); dispatch_group_t group = dispatch_group_create(); for(id obj in array) { dispatch_group_async(group, queue, ^{ [self doSomethingIntensiveWith:obj]; }); } dispatch_group_notify(group, queue, ^{ [self doSomethingWith:array]; }); dispatch_release(group); Глобальные очереди. Использование групп. Синхронное и асинхронное выполнение Синхронный вариант выполнения очереди: dispatch_queue_t queue = dispatch_get_global_qeueue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_apply([array count], queue, ^(size_t index){ [self doSomethingIntensiveWith:[array objectAtIndex:index]]; }); [self doSomethingWith:array]; Асинхронный вариант выполнения очереди: dispatch_queue_t queue = dispatch_get_global_qeueue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_async(queue, ^{ dispatch_apply([array count], queue, ^(size_t index){ [self doSomethingIntensiveWith:[array objectAtIndex:index]]; }); [self doSomethingWith:array]; }); Выводы Простой низкоуровневый фреймворк для работы с потоками Преимущества удобства и скорости работы по сравнению с классическими ООП-подходами распараллеливания Кроссплатформенность и легкая переносимость кода Широкие возможности при простоте использования Благодарю за внимание! Ваши вопросы? Докладчик: Петрусь Андрей Сергеевич andrew@madappgang.com iOS-developer, MadAppGang