SlideShare a Scribd company logo
1 of 22
Download to read offline
iOS Internship 2014
Асинхронность
Асинхронность
NSThread
NSOperation
Grand Central Dispatch
Асинхронность
● Все долгие операции нужно выполнять не в главном потоке
● Все операции с UI нужно выполнять в главном потоке
● Нельзя обращаться к одному (изменяемому) объекту из разных потоков "одновременно"
● Результат работы не должен зависеть от порядка выполнения асинхронных операций
● Распараллеливание независимых операций может ускорить работу программы
Асинхронность в iOS
Асинхронность
● NSThread
○ Используется для длительных (или бесконечных) задач
○ Явное создание потока (нужно использовать с умом)
● NSOperation
○ Используется для логически обособленных задач
○ Потоки создаются автоматически (например по количеству ядер процессора)
○ Поддержка отмены операций
○ Поддержка графа зависимостей между операциями
○ Поддержка приоритезации операций
● GCD
○ Лучшая производительность
○ Относительно низкоуровневое C API
○ Для простых задач — короткая запись
○ Используется для быстрого перехода между главным и фоновым потоками
Асинхронность в iOS
Асинхронность
● NSThread
○ Используется для длительных (или бесконечных) задач
○ Явное создание потока (нужно использовать с умом)
● NSOperation
○ Используется для логически обособленных задач
○ Потоки создаются автоматически (например по количеству ядер процессора)
○ Поддержка отмены операций
○ Поддержка графа зависимостей между операциями
○ Поддержка приоритезации операций
● GCD
○ Лучшая производительность
○ Относительно низкоуровневое C API
○ Для простых задач — короткая запись
○ Используется для быстрого перехода между главным и фоновым потоками
Асинхронность в iOS
Асинхронность
● Исполняем уже имеющийся метод в отдельном потоке:
NSThread *thread = [[NSThread alloc]
initWithTarget:self
selector:@selector(xxx)
object:nil];
[thread start];
● Создаём подкласс NSThread, переопределяем метод main, у экземпляра класса
вызываем start.
NSThread
Асинхронность
● NSThread
○ Используется для длительных (или бесконечных) задач
○ Явное создание потока (нужно использовать с умом)
● NSOperation
○ Используется для логически обособленных задач
○ Потоки создаются автоматически (например по количеству ядер процессора)
○ Поддержка отмены операций
○ Поддержка графа зависимостей между операциями
○ Поддержка приоритезации операций
● GCD
○ Лучшая производительность
○ Относительно низкоуровневое C API
○ Для простых задач — короткая запись
○ Используется для быстрого перехода между главным и фоновым потоками
Асинхронность в iOS
Асинхронность
NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{
//...
}];
NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{
//...
}];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue addOperation:operation1];
[queue addOperation:operation2];
NSOperation
Асинхронность
NSOperation
NSOperation *operation1, *operation2, *operation3;
NSOperationQueue *queue;
//...
operation1.queuePriority = NSOperationQueuePriorityLow;
operation2.queuePriority = NSOperationQueuePriorityHigh;
[operation3 addDependency:operation1];
[operation3 addDependency:operation2];
[queue addOperation:operation1];
[queue addOperation:operation2];
[queue addOperation:operation3];
Асинхронность
NSOperation *operation1, *operation2;
NSOperationQueue *queue;
//...
operation1 = [[NSInvocationOperation alloc]
initWithTarget:self
selector:@selector(printCount)
object:nil];
operation2 = [[MyCustomOperation alloc] init];
[queue addOperation:operation1];
[queue addOperation:operation2];
NSOperation
Асинхронность
● NSThread
○ Используется для длительных (или бесконечных) задач
○ Явное создание потока (нужно использовать с умом)
● NSOperation
○ Используется для логически обособленных задач
○ Потоки создаются автоматически (например по количеству ядер процессора)
○ Поддержка отмены операций
○ Поддержка графа зависимостей между операциями
○ Поддержка приоритезации операций
● GCD
○ Лучшая производительность
○ Относительно низкоуровневое C API
○ Для простых задач — короткая запись
○ Используется для быстрого перехода между главным и фоновым потоками
Асинхронность в iOS
Асинхронность
dispatch_queue_t queue =
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
// Блок выполняется асинхронно
//...
});
// Программа продолжает выполняться, не дожидаясь выполнения блока
//...
GCD асинхронное выполнение
Асинхронность
dispatch_queue_t queue =
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
// Блок выполняется асинхронно
//...
dispatch_async(dispatch_get_main_queue(), ^{
// Выполнить в главном потоке
// Например обновить UI, используя асинхронно полученные данные
//...
});
});
// Программа продолжает выполняться, не дожидаясь выполнения блока
//...
GCD асинхронное выполнение
Асинхронность
dispatch_queue_t queue1 = dispatch_queue_create("MyQueue1", NULL);
dispatch_queue_t queue2 = dispatch_queue_create("MyQueue2", NULL);
void (^myBlock1)(void) = ^ {/*...*/};
void (^myBlock2)(void) = ^ {/*...*/};
void (^myBlock3)(void) = ^ {/*...*/};
dispatch_async(queue1, myBlock1);
dispatch_async(queue2, myBlock2);
dispatch_async(queue2, myBlock3);
GCD очереди
queue1
queue2
block1
block2 block3
Асинхронность
GCD распараллеленное итерирование
int n = 42;
dispatch_queue_t queue =
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_apply(n, queue, ^(size_t i) {
// Выполнить 42 независимых операции,
// некоторые из них будут распараллелены.
// i - номер текущей операции.
//...
});
// Сюда управление переходит когда все операции выполнены
//...
Асинхронность
GCD распараллеленное итерирование
int n = 42;
dispatch_queue_t queue =
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
dispatch_apply(n, queue, ^(size_t i) {
// Выполнить 42 независимых операции,
// некоторые из них будут распараллелены.
// i - номер текущей операции.
//...
});
// Сюда управление переходит когда все операции выполнены
//...
});
// Сюда мы попадаем не дожидаясь выполнения предыдущего блока
//...
Асинхронность
GCD группы
dispatch_queue_t queue =
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t group = dispatch_group_create();
dispatch_async(queue, ^{
dispatch_group_async(group, queue, ^{
// Do some work 1.
//...
});
// Do some work 2.
//...
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
// Do some work 3.
//... work 1
work 2 work 3
время
Асинхронность
+ (Singleton *)sharedInstance
{
static Singleton *_sharedInstance = nil;
if (_sharedInstance == nil) {
_sharedInstance = [[Singleton alloc] init];
}
return _sharedInstance;
}
Что произойдёт, если вызвать sharedInstance из двух разных потоков "одновременно", когда
объект ещё не создан?
Потокобезопасность
Асинхронность
GCD once
+ (Singleton *)sharedInstance
{
static Singleton *_sharedInstance = nil;
if (_sharedInstance == nil) {
_sharedInstance = [[Singleton alloc] init];
}
return _sharedInstance;
}
+ (Singleton *)sharedInstance
{
static Singleton *_sharedInstance = nil;
static dispatch_once_t predicate;
dispatch_once(&predicate, ^{
_sharedInstance = [[Singleton alloc] init];
});
return _sharedInstance;
}
Асинхронность
Потокобезопасность
- (void)showCurrentData
{
//...
self.someLabel.text = self.someString;
}
- (void)didReceiveSomeStringFromNetwork:(NSString *)someString
{
self.someString = someString;
[self showCurrentData];
}
Что произойдёт когда мы получим новые данные по сети (в фоновом потоке)?
Асинхронность
- (void)showCurrentData
{
void(^updateBlock)(void) = ^{
self.someLabel.text = self.someString;
};
if ([NSThread isMainThread]) {
updateBlock();
}
else {
dispatch_async(dispatch_get_main_queue(), updateBlock);
}
}
- (void)didReceiveSomeStringFromNetwork:(NSString *)someString
{
self.someString = someString;
[self showCurrentData];
}
Потокобезопасность
Асинхронность
Потокобезопасность
- (void)showCurrentData
{
//...
self.someLabel.text = self.someString;
}
- (void)didReceiveSomeStringFromNetwork:(NSString *)someString
{
self.someString = someString;
[self performSelectorOnMainThread:@selector(showCurrentData)
withObject:nil
waitUntilDone:NO];
}

More Related Content

What's hot

Правильная работа с часовыми поясами в Rails приложении — DevConf 2015
Правильная работа с часовыми поясами в Rails приложении — DevConf 2015Правильная работа с часовыми поясами в Rails приложении — DevConf 2015
Правильная работа с часовыми поясами в Rails приложении — DevConf 2015Андрей Новиков
 
Опыт разработки, отладки и внедрения системы горячего резервирования торговой...
Опыт разработки, отладки и внедрения системы горячего резервирования торговой...Опыт разработки, отладки и внедрения системы горячего резервирования торговой...
Опыт разработки, отладки и внедрения системы горячего резервирования торговой...Ontico
 
Алексей Рагозин (Deutsche Bank)
Алексей Рагозин (Deutsche Bank)Алексей Рагозин (Deutsche Bank)
Алексей Рагозин (Deutsche Bank)Ontico
 
Multiprocessor Programming Intro (lecture 2)
Multiprocessor Programming Intro (lecture 2)Multiprocessor Programming Intro (lecture 2)
Multiprocessor Programming Intro (lecture 2)Dmitry Tsitelov
 
Жилье комфорт-класса для акторов и хендлеров. Максим Хижинский. CoreHard Spri...
Жилье комфорт-класса для акторов и хендлеров. Максим Хижинский. CoreHard Spri...Жилье комфорт-класса для акторов и хендлеров. Максим Хижинский. CoreHard Spri...
Жилье комфорт-класса для акторов и хендлеров. Максим Хижинский. CoreHard Spri...corehard_by
 
Облако в Badoo год спустя
Облако в Badoo год спустяОблако в Badoo год спустя
Облако в Badoo год спустяYuriy Nasretdinov
 
Ровная балансировка нагрузки на фронтенд-кластере
Ровная балансировка нагрузки на фронтенд-кластереРовная балансировка нагрузки на фронтенд-кластере
Ровная балансировка нагрузки на фронтенд-кластереBadoo Development
 
Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)
Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)
Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)Ontico
 
Programming Java - Lection 06 - Multithreading - Lavrentyev Fedor
Programming Java - Lection 06 - Multithreading - Lavrentyev FedorProgramming Java - Lection 06 - Multithreading - Lavrentyev Fedor
Programming Java - Lection 06 - Multithreading - Lavrentyev FedorFedor Lavrentyev
 
презентация л.р. №16
презентация л.р. №16презентация л.р. №16
презентация л.р. №16student_kai
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPMikhail Kurnosov
 
Часть 6: Оркестрация контейнеров
Часть 6: Оркестрация контейнеровЧасть 6: Оркестрация контейнеров
Часть 6: Оркестрация контейнеровOleg Popov
 
JIT-компиляция в виртуальной машине Java (HighLoad++ 2013)
JIT-компиляция в виртуальной машине Java (HighLoad++ 2013)JIT-компиляция в виртуальной машине Java (HighLoad++ 2013)
JIT-компиляция в виртуальной машине Java (HighLoad++ 2013)aragozin
 
Tarantool Modules, Tarantool Meetup 2016-08-25
Tarantool Modules, Tarantool Meetup 2016-08-25Tarantool Modules, Tarantool Meetup 2016-08-25
Tarantool Modules, Tarantool Meetup 2016-08-25Roman Tsisyk
 
Использование Time-Stamp Counter для измерения времени выполнения кода на пр...
Использование Time-Stamp Counter для измерения времени выполнения кода  на пр...Использование Time-Stamp Counter для измерения времени выполнения кода  на пр...
Использование Time-Stamp Counter для измерения времени выполнения кода на пр...Mikhail Kurnosov
 
Анатомия веб-сервиса (РИТ-2014)
Анатомия веб-сервиса (РИТ-2014)Анатомия веб-сервиса (РИТ-2014)
Анатомия веб-сервиса (РИТ-2014)Andrey Smirnov
 
Дополненная Реальность в Облаке
Дополненная Реальность в ОблакеДополненная Реальность в Облаке
Дополненная Реальность в ОблакеGeeksLab Odessa
 
Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Mikhail Kurnosov
 

What's hot (19)

Правильная работа с часовыми поясами в Rails приложении — DevConf 2015
Правильная работа с часовыми поясами в Rails приложении — DevConf 2015Правильная работа с часовыми поясами в Rails приложении — DevConf 2015
Правильная работа с часовыми поясами в Rails приложении — DevConf 2015
 
Опыт разработки, отладки и внедрения системы горячего резервирования торговой...
Опыт разработки, отладки и внедрения системы горячего резервирования торговой...Опыт разработки, отладки и внедрения системы горячего резервирования торговой...
Опыт разработки, отладки и внедрения системы горячего резервирования торговой...
 
Алексей Рагозин (Deutsche Bank)
Алексей Рагозин (Deutsche Bank)Алексей Рагозин (Deutsche Bank)
Алексей Рагозин (Deutsche Bank)
 
Multiprocessor Programming Intro (lecture 2)
Multiprocessor Programming Intro (lecture 2)Multiprocessor Programming Intro (lecture 2)
Multiprocessor Programming Intro (lecture 2)
 
Жилье комфорт-класса для акторов и хендлеров. Максим Хижинский. CoreHard Spri...
Жилье комфорт-класса для акторов и хендлеров. Максим Хижинский. CoreHard Spri...Жилье комфорт-класса для акторов и хендлеров. Максим Хижинский. CoreHard Spri...
Жилье комфорт-класса для акторов и хендлеров. Максим Хижинский. CoreHard Spri...
 
Облако в Badoo год спустя
Облако в Badoo год спустяОблако в Badoo год спустя
Облако в Badoo год спустя
 
Ровная балансировка нагрузки на фронтенд-кластере
Ровная балансировка нагрузки на фронтенд-кластереРовная балансировка нагрузки на фронтенд-кластере
Ровная балансировка нагрузки на фронтенд-кластере
 
Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)
Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)
Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)
 
Programming Java - Lection 06 - Multithreading - Lavrentyev Fedor
Programming Java - Lection 06 - Multithreading - Lavrentyev FedorProgramming Java - Lection 06 - Multithreading - Lavrentyev Fedor
Programming Java - Lection 06 - Multithreading - Lavrentyev Fedor
 
презентация л.р. №16
презентация л.р. №16презентация л.р. №16
презентация л.р. №16
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMP
 
Часть 6: Оркестрация контейнеров
Часть 6: Оркестрация контейнеровЧасть 6: Оркестрация контейнеров
Часть 6: Оркестрация контейнеров
 
JIT-компиляция в виртуальной машине Java (HighLoad++ 2013)
JIT-компиляция в виртуальной машине Java (HighLoad++ 2013)JIT-компиляция в виртуальной машине Java (HighLoad++ 2013)
JIT-компиляция в виртуальной машине Java (HighLoad++ 2013)
 
Tarantool Modules, Tarantool Meetup 2016-08-25
Tarantool Modules, Tarantool Meetup 2016-08-25Tarantool Modules, Tarantool Meetup 2016-08-25
Tarantool Modules, Tarantool Meetup 2016-08-25
 
Использование Time-Stamp Counter для измерения времени выполнения кода на пр...
Использование Time-Stamp Counter для измерения времени выполнения кода  на пр...Использование Time-Stamp Counter для измерения времени выполнения кода  на пр...
Использование Time-Stamp Counter для измерения времени выполнения кода на пр...
 
Анатомия веб-сервиса (РИТ-2014)
Анатомия веб-сервиса (РИТ-2014)Анатомия веб-сервиса (РИТ-2014)
Анатомия веб-сервиса (РИТ-2014)
 
Дополненная Реальность в Облаке
Дополненная Реальность в ОблакеДополненная Реальность в Облаке
Дополненная Реальность в Облаке
 
Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)
 
Linux Kernel Processes
Linux Kernel ProcessesLinux Kernel Processes
Linux Kernel Processes
 

Similar to iOS-07_2 Multithreading

ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...Alexey Paznikov
 
Netmap (by luigi rizzo) простой и удобный opensource фреймворк для обработк...
Netmap (by luigi rizzo)   простой и удобный opensource фреймворк для обработк...Netmap (by luigi rizzo)   простой и удобный opensource фреймворк для обработк...
Netmap (by luigi rizzo) простой и удобный opensource фреймворк для обработк...Ontico
 
Павел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладкаПавел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладкаSergey Platonov
 
Оптимизация программ для современных процессоров и Linux, Александр Крижановс...
Оптимизация программ для современных процессоров и Linux, Александр Крижановс...Оптимизация программ для современных процессоров и Linux, Александр Крижановс...
Оптимизация программ для современных процессоров и Linux, Александр Крижановс...Ontico
 
разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2Eugeniy Tyumentcev
 
разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2etyumentcev
 
Асинхронность и сопрограммы
Асинхронность и сопрограммыАсинхронность и сопрограммы
Асинхронность и сопрограммыPlatonov Sergey
 
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...Alexey Paznikov
 
Когда в C# не хватает C++ . Часть 3.
Когда в C# не хватает C++. Часть 3. Когда в C# не хватает C++. Часть 3.
Когда в C# не хватает C++ . Часть 3. Mikhail Shcherbakov
 
SAMag2007 Conference: PostgreSQL 8.3 presentation
SAMag2007 Conference: PostgreSQL 8.3 presentationSAMag2007 Conference: PostgreSQL 8.3 presentation
SAMag2007 Conference: PostgreSQL 8.3 presentationNikolay Samokhvalov
 
Tech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU
 
Как приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVMКак приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVMTech Talks @NSU
 
Константин Осипов (Mail.Ru)
Константин Осипов (Mail.Ru)Константин Осипов (Mail.Ru)
Константин Осипов (Mail.Ru)Ontico
 
nginx internals
nginx internalsnginx internals
nginx internalsredivy
 
2012 03 14_parallel_programming_lecture05
2012 03 14_parallel_programming_lecture052012 03 14_parallel_programming_lecture05
2012 03 14_parallel_programming_lecture05Computer Science Club
 
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...Alexey Paznikov
 
JPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profilerJPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profilerAnton Arhipov
 
Что такое Postgresql (Максим Богук)
Что такое Postgresql (Максим Богук)Что такое Postgresql (Максим Богук)
Что такое Postgresql (Максим Богук)Ontico
 
Разработка высокопроизводительных серверных приложений для Linux/Unix (Алекса...
Разработка высокопроизводительных серверных приложений для Linux/Unix (Алекса...Разработка высокопроизводительных серверных приложений для Linux/Unix (Алекса...
Разработка высокопроизводительных серверных приложений для Linux/Unix (Алекса...Ontico
 

Similar to iOS-07_2 Multithreading (20)

ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...
 
Netmap (by luigi rizzo) простой и удобный opensource фреймворк для обработк...
Netmap (by luigi rizzo)   простой и удобный opensource фреймворк для обработк...Netmap (by luigi rizzo)   простой и удобный opensource фреймворк для обработк...
Netmap (by luigi rizzo) простой и удобный opensource фреймворк для обработк...
 
Павел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладкаПавел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладка
 
Оптимизация программ для современных процессоров и Linux, Александр Крижановс...
Оптимизация программ для современных процессоров и Linux, Александр Крижановс...Оптимизация программ для современных процессоров и Linux, Александр Крижановс...
Оптимизация программ для современных процессоров и Linux, Александр Крижановс...
 
разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2
 
разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2
 
Асинхронность и сопрограммы
Асинхронность и сопрограммыАсинхронность и сопрограммы
Асинхронность и сопрограммы
 
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...
 
Когда в C# не хватает C++ . Часть 3.
Когда в C# не хватает C++. Часть 3. Когда в C# не хватает C++. Часть 3.
Когда в C# не хватает C++ . Часть 3.
 
SAMag2007 Conference: PostgreSQL 8.3 presentation
SAMag2007 Conference: PostgreSQL 8.3 presentationSAMag2007 Conference: PostgreSQL 8.3 presentation
SAMag2007 Conference: PostgreSQL 8.3 presentation
 
Tech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVM
 
Как приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVMКак приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVM
 
Константин Осипов (Mail.Ru)
Константин Осипов (Mail.Ru)Константин Осипов (Mail.Ru)
Константин Осипов (Mail.Ru)
 
nginx internals
nginx internalsnginx internals
nginx internals
 
2012 03 14_parallel_programming_lecture05
2012 03 14_parallel_programming_lecture052012 03 14_parallel_programming_lecture05
2012 03 14_parallel_programming_lecture05
 
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
 
JPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profilerJPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profiler
 
CUDA Best Practices (2-3)
CUDA Best Practices (2-3)CUDA Best Practices (2-3)
CUDA Best Practices (2-3)
 
Что такое Postgresql (Максим Богук)
Что такое Postgresql (Максим Богук)Что такое Postgresql (Максим Богук)
Что такое Postgresql (Максим Богук)
 
Разработка высокопроизводительных серверных приложений для Linux/Unix (Алекса...
Разработка высокопроизводительных серверных приложений для Linux/Unix (Алекса...Разработка высокопроизводительных серверных приложений для Linux/Unix (Алекса...
Разработка высокопроизводительных серверных приложений для Linux/Unix (Алекса...
 

More from Noveo

Гуманитарные специальности в IT-индустрии
Гуманитарные специальности в IT-индустрииГуманитарные специальности в IT-индустрии
Гуманитарные специальности в IT-индустрииNoveo
 
Box model, display and position (HTML5 тема 07 - box model, display position)
Box model, display and position (HTML5 тема 07 - box model, display position)Box model, display and position (HTML5 тема 07 - box model, display position)
Box model, display and position (HTML5 тема 07 - box model, display position)Noveo
 
Ссылки, списки и меню (HTML5 тема 06 - ссылки, списки и меню)
Ссылки, списки и меню (HTML5 тема 06 - ссылки, списки и меню)Ссылки, списки и меню (HTML5 тема 06 - ссылки, списки и меню)
Ссылки, списки и меню (HTML5 тема 06 - ссылки, списки и меню)Noveo
 
Стилизация текста (HTML5 тема 05 - стилизация текста)
Стилизация текста (HTML5 тема 05 - стилизация текста)Стилизация текста (HTML5 тема 05 - стилизация текста)
Стилизация текста (HTML5 тема 05 - стилизация текста)Noveo
 
Семантика текста (HTML5 тема 04 - семантика текста)
Семантика текста (HTML5 тема 04 - семантика текста)Семантика текста (HTML5 тема 04 - семантика текста)
Семантика текста (HTML5 тема 04 - семантика текста)Noveo
 
Основы CSS (HTML5 тема 02 - основы CSS)
Основы CSS (HTML5 тема 02 - основы CSS)Основы CSS (HTML5 тема 02 - основы CSS)
Основы CSS (HTML5 тема 02 - основы CSS)Noveo
 
Структура HTML документа (HTML5 тема 01 - структура html документа)
Структура HTML документа (HTML5 тема 01 - структура html документа)Структура HTML документа (HTML5 тема 01 - структура html документа)
Структура HTML документа (HTML5 тема 01 - структура html документа)Noveo
 
Yii2
Yii2Yii2
Yii2Noveo
 
Сессии и авторизация
Сессии и авторизацияСессии и авторизация
Сессии и авторизацияNoveo
 
Rest
RestRest
RestNoveo
 
PHP basic
PHP basicPHP basic
PHP basicNoveo
 
PHP Advanced
PHP AdvancedPHP Advanced
PHP AdvancedNoveo
 
PHP and MySQL
PHP and MySQLPHP and MySQL
PHP and MySQLNoveo
 
MySQL
MySQLMySQL
MySQLNoveo
 
Push Notifications (Lecture 22 – push notifications)
Push Notifications (Lecture 22 – push notifications)Push Notifications (Lecture 22 – push notifications)
Push Notifications (Lecture 22 – push notifications)Noveo
 
RxJava+RxAndroid (Lecture 20 – rx java)
RxJava+RxAndroid (Lecture 20 – rx java)RxJava+RxAndroid (Lecture 20 – rx java)
RxJava+RxAndroid (Lecture 20 – rx java)Noveo
 
Работа с соцсетями (Lecture 19 – social)
Работа с соцсетями (Lecture 19 – social)Работа с соцсетями (Lecture 19 – social)
Работа с соцсетями (Lecture 19 – social)Noveo
 
Работа с геоданными (Lecture 18 – geolocation)
Работа с геоданными (Lecture 18 – geolocation)Работа с геоданными (Lecture 18 – geolocation)
Работа с геоданными (Lecture 18 – geolocation)Noveo
 
Animations (Lecture 17 – animations)
Animations (Lecture 17 – animations)Animations (Lecture 17 – animations)
Animations (Lecture 17 – animations)Noveo
 
Toolbar (Lecture 16 – toolbar)
Toolbar (Lecture 16 – toolbar)Toolbar (Lecture 16 – toolbar)
Toolbar (Lecture 16 – toolbar)Noveo
 

More from Noveo (20)

Гуманитарные специальности в IT-индустрии
Гуманитарные специальности в IT-индустрииГуманитарные специальности в IT-индустрии
Гуманитарные специальности в IT-индустрии
 
Box model, display and position (HTML5 тема 07 - box model, display position)
Box model, display and position (HTML5 тема 07 - box model, display position)Box model, display and position (HTML5 тема 07 - box model, display position)
Box model, display and position (HTML5 тема 07 - box model, display position)
 
Ссылки, списки и меню (HTML5 тема 06 - ссылки, списки и меню)
Ссылки, списки и меню (HTML5 тема 06 - ссылки, списки и меню)Ссылки, списки и меню (HTML5 тема 06 - ссылки, списки и меню)
Ссылки, списки и меню (HTML5 тема 06 - ссылки, списки и меню)
 
Стилизация текста (HTML5 тема 05 - стилизация текста)
Стилизация текста (HTML5 тема 05 - стилизация текста)Стилизация текста (HTML5 тема 05 - стилизация текста)
Стилизация текста (HTML5 тема 05 - стилизация текста)
 
Семантика текста (HTML5 тема 04 - семантика текста)
Семантика текста (HTML5 тема 04 - семантика текста)Семантика текста (HTML5 тема 04 - семантика текста)
Семантика текста (HTML5 тема 04 - семантика текста)
 
Основы CSS (HTML5 тема 02 - основы CSS)
Основы CSS (HTML5 тема 02 - основы CSS)Основы CSS (HTML5 тема 02 - основы CSS)
Основы CSS (HTML5 тема 02 - основы CSS)
 
Структура HTML документа (HTML5 тема 01 - структура html документа)
Структура HTML документа (HTML5 тема 01 - структура html документа)Структура HTML документа (HTML5 тема 01 - структура html документа)
Структура HTML документа (HTML5 тема 01 - структура html документа)
 
Yii2
Yii2Yii2
Yii2
 
Сессии и авторизация
Сессии и авторизацияСессии и авторизация
Сессии и авторизация
 
Rest
RestRest
Rest
 
PHP basic
PHP basicPHP basic
PHP basic
 
PHP Advanced
PHP AdvancedPHP Advanced
PHP Advanced
 
PHP and MySQL
PHP and MySQLPHP and MySQL
PHP and MySQL
 
MySQL
MySQLMySQL
MySQL
 
Push Notifications (Lecture 22 – push notifications)
Push Notifications (Lecture 22 – push notifications)Push Notifications (Lecture 22 – push notifications)
Push Notifications (Lecture 22 – push notifications)
 
RxJava+RxAndroid (Lecture 20 – rx java)
RxJava+RxAndroid (Lecture 20 – rx java)RxJava+RxAndroid (Lecture 20 – rx java)
RxJava+RxAndroid (Lecture 20 – rx java)
 
Работа с соцсетями (Lecture 19 – social)
Работа с соцсетями (Lecture 19 – social)Работа с соцсетями (Lecture 19 – social)
Работа с соцсетями (Lecture 19 – social)
 
Работа с геоданными (Lecture 18 – geolocation)
Работа с геоданными (Lecture 18 – geolocation)Работа с геоданными (Lecture 18 – geolocation)
Работа с геоданными (Lecture 18 – geolocation)
 
Animations (Lecture 17 – animations)
Animations (Lecture 17 – animations)Animations (Lecture 17 – animations)
Animations (Lecture 17 – animations)
 
Toolbar (Lecture 16 – toolbar)
Toolbar (Lecture 16 – toolbar)Toolbar (Lecture 16 – toolbar)
Toolbar (Lecture 16 – toolbar)
 

iOS-07_2 Multithreading

  • 3. Асинхронность ● Все долгие операции нужно выполнять не в главном потоке ● Все операции с UI нужно выполнять в главном потоке ● Нельзя обращаться к одному (изменяемому) объекту из разных потоков "одновременно" ● Результат работы не должен зависеть от порядка выполнения асинхронных операций ● Распараллеливание независимых операций может ускорить работу программы Асинхронность в iOS
  • 4. Асинхронность ● NSThread ○ Используется для длительных (или бесконечных) задач ○ Явное создание потока (нужно использовать с умом) ● NSOperation ○ Используется для логически обособленных задач ○ Потоки создаются автоматически (например по количеству ядер процессора) ○ Поддержка отмены операций ○ Поддержка графа зависимостей между операциями ○ Поддержка приоритезации операций ● GCD ○ Лучшая производительность ○ Относительно низкоуровневое C API ○ Для простых задач — короткая запись ○ Используется для быстрого перехода между главным и фоновым потоками Асинхронность в iOS
  • 5. Асинхронность ● NSThread ○ Используется для длительных (или бесконечных) задач ○ Явное создание потока (нужно использовать с умом) ● NSOperation ○ Используется для логически обособленных задач ○ Потоки создаются автоматически (например по количеству ядер процессора) ○ Поддержка отмены операций ○ Поддержка графа зависимостей между операциями ○ Поддержка приоритезации операций ● GCD ○ Лучшая производительность ○ Относительно низкоуровневое C API ○ Для простых задач — короткая запись ○ Используется для быстрого перехода между главным и фоновым потоками Асинхронность в iOS
  • 6. Асинхронность ● Исполняем уже имеющийся метод в отдельном потоке: NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(xxx) object:nil]; [thread start]; ● Создаём подкласс NSThread, переопределяем метод main, у экземпляра класса вызываем start. NSThread
  • 7. Асинхронность ● NSThread ○ Используется для длительных (или бесконечных) задач ○ Явное создание потока (нужно использовать с умом) ● NSOperation ○ Используется для логически обособленных задач ○ Потоки создаются автоматически (например по количеству ядер процессора) ○ Поддержка отмены операций ○ Поддержка графа зависимостей между операциями ○ Поддержка приоритезации операций ● GCD ○ Лучшая производительность ○ Относительно низкоуровневое C API ○ Для простых задач — короткая запись ○ Используется для быстрого перехода между главным и фоновым потоками Асинхронность в iOS
  • 8. Асинхронность NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{ //... }]; NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{ //... }]; NSOperationQueue *queue = [[NSOperationQueue alloc] init]; [queue addOperation:operation1]; [queue addOperation:operation2]; NSOperation
  • 9. Асинхронность NSOperation NSOperation *operation1, *operation2, *operation3; NSOperationQueue *queue; //... operation1.queuePriority = NSOperationQueuePriorityLow; operation2.queuePriority = NSOperationQueuePriorityHigh; [operation3 addDependency:operation1]; [operation3 addDependency:operation2]; [queue addOperation:operation1]; [queue addOperation:operation2]; [queue addOperation:operation3];
  • 10. Асинхронность NSOperation *operation1, *operation2; NSOperationQueue *queue; //... operation1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(printCount) object:nil]; operation2 = [[MyCustomOperation alloc] init]; [queue addOperation:operation1]; [queue addOperation:operation2]; NSOperation
  • 11. Асинхронность ● NSThread ○ Используется для длительных (или бесконечных) задач ○ Явное создание потока (нужно использовать с умом) ● NSOperation ○ Используется для логически обособленных задач ○ Потоки создаются автоматически (например по количеству ядер процессора) ○ Поддержка отмены операций ○ Поддержка графа зависимостей между операциями ○ Поддержка приоритезации операций ● GCD ○ Лучшая производительность ○ Относительно низкоуровневое C API ○ Для простых задач — короткая запись ○ Используется для быстрого перехода между главным и фоновым потоками Асинхронность в iOS
  • 12. Асинхронность dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_async(queue, ^{ // Блок выполняется асинхронно //... }); // Программа продолжает выполняться, не дожидаясь выполнения блока //... GCD асинхронное выполнение
  • 13. Асинхронность dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_async(queue, ^{ // Блок выполняется асинхронно //... dispatch_async(dispatch_get_main_queue(), ^{ // Выполнить в главном потоке // Например обновить UI, используя асинхронно полученные данные //... }); }); // Программа продолжает выполняться, не дожидаясь выполнения блока //... GCD асинхронное выполнение
  • 14. Асинхронность dispatch_queue_t queue1 = dispatch_queue_create("MyQueue1", NULL); dispatch_queue_t queue2 = dispatch_queue_create("MyQueue2", NULL); void (^myBlock1)(void) = ^ {/*...*/}; void (^myBlock2)(void) = ^ {/*...*/}; void (^myBlock3)(void) = ^ {/*...*/}; dispatch_async(queue1, myBlock1); dispatch_async(queue2, myBlock2); dispatch_async(queue2, myBlock3); GCD очереди queue1 queue2 block1 block2 block3
  • 15. Асинхронность GCD распараллеленное итерирование int n = 42; dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_apply(n, queue, ^(size_t i) { // Выполнить 42 независимых операции, // некоторые из них будут распараллелены. // i - номер текущей операции. //... }); // Сюда управление переходит когда все операции выполнены //...
  • 16. Асинхронность GCD распараллеленное итерирование int n = 42; dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_async(queue, ^{ dispatch_apply(n, queue, ^(size_t i) { // Выполнить 42 независимых операции, // некоторые из них будут распараллелены. // i - номер текущей операции. //... }); // Сюда управление переходит когда все операции выполнены //... }); // Сюда мы попадаем не дожидаясь выполнения предыдущего блока //...
  • 17. Асинхронность GCD группы dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_group_t group = dispatch_group_create(); dispatch_async(queue, ^{ dispatch_group_async(group, queue, ^{ // Do some work 1. //... }); // Do some work 2. //... dispatch_group_wait(group, DISPATCH_TIME_FOREVER); // Do some work 3. //... work 1 work 2 work 3 время
  • 18. Асинхронность + (Singleton *)sharedInstance { static Singleton *_sharedInstance = nil; if (_sharedInstance == nil) { _sharedInstance = [[Singleton alloc] init]; } return _sharedInstance; } Что произойдёт, если вызвать sharedInstance из двух разных потоков "одновременно", когда объект ещё не создан? Потокобезопасность
  • 19. Асинхронность GCD once + (Singleton *)sharedInstance { static Singleton *_sharedInstance = nil; if (_sharedInstance == nil) { _sharedInstance = [[Singleton alloc] init]; } return _sharedInstance; } + (Singleton *)sharedInstance { static Singleton *_sharedInstance = nil; static dispatch_once_t predicate; dispatch_once(&predicate, ^{ _sharedInstance = [[Singleton alloc] init]; }); return _sharedInstance; }
  • 20. Асинхронность Потокобезопасность - (void)showCurrentData { //... self.someLabel.text = self.someString; } - (void)didReceiveSomeStringFromNetwork:(NSString *)someString { self.someString = someString; [self showCurrentData]; } Что произойдёт когда мы получим новые данные по сети (в фоновом потоке)?
  • 21. Асинхронность - (void)showCurrentData { void(^updateBlock)(void) = ^{ self.someLabel.text = self.someString; }; if ([NSThread isMainThread]) { updateBlock(); } else { dispatch_async(dispatch_get_main_queue(), updateBlock); } } - (void)didReceiveSomeStringFromNetwork:(NSString *)someString { self.someString = someString; [self showCurrentData]; } Потокобезопасность
  • 22. Асинхронность Потокобезопасность - (void)showCurrentData { //... self.someLabel.text = self.someString; } - (void)didReceiveSomeStringFromNetwork:(NSString *)someString { self.someString = someString; [self performSelectorOnMainThread:@selector(showCurrentData) withObject:nil waitUntilDone:NO]; }