Слайд 1Grand Central Dispatch
Петрусь А.С., iOS-developer, MadAppGang
Слайд 2Рыночная доля iOS-устройств (2013)
Слайд 3GCD - низкоуровневое API для параллельного программирования.
Слайд 4Преимущества использования
Простота использования
Эффективность
Производительность
Слайд 6Передача заданий в очередь
Пример 1
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self goDoSomethingLongAndInvolved];
NSLog(@"Done
doing something long and involved");
});
Слайд 7Передача заданий в очередь
Пример 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"];
});
});
Слайд 8Передача заданий в очередь
Пример 3. Блочные переменные
__block NSString *stringValue;
dispatch_sync(dispatch_get_main_queue(), ^{
stringValue
= [[textField stringValue] copy];
});
[stringValue autorelease];
Слайд 9Передача заданий в очередь
Пример 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
});
});
Слайд 11Глобальные очереди
Исходный цикл:
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];
});
}
Слайд 12Глобальные очереди. Использование групп. Пример 1
dispatch_queue_t queue = dispatch_get_global_qeueue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
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];
Слайд 13Глобальные очереди. Использование групп. Пример 2
dispatch_queue_t queue = dispatch_get_global_qeueue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
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);
Слайд 14Глобальные очереди. Использование групп. Синхронное и асинхронное выполнение
Синхронный вариант выполнения
очереди:
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];
});
Слайд 15Выводы
Простой низкоуровневый фреймворк для работы с потоками
Преимущества удобства и скорости
работы по сравнению с классическими ООП-подходами распараллеливания
Кроссплатформенность и легкая переносимость
кода
Широкие возможности при простоте использования
Слайд 16Благодарю за внимание! Ваши вопросы?
Докладчик: Петрусь Андрей Сергеевич
andrew@madappgang.com
iOS-developer, MadAppGang