четверг, 13 августа 2015 г.

13. Многопоточность

Ссылка на видео урок.

Потоки делятся на главный и фоновые.
Раньше мы работали с главным потоком.

Простейший способ запустить свой метод (testThread) в фоновый поток:

 [self performSelectorInBackground:@selector(testThread) withObject:nil];

Более продвинутый способ с дополнительными настройками и возможностями:

    //  NSThread * thread=[[NSThread alloc] initWithTarget:self selector:@selector(testThread) object:nil];
    //[thread start];

Можно задать имя потоку:
    thread1.name=[NSString stringWithFormat:@"Thread X"];


Для вывода результата запускаем метод вывода с задержкой 5 секунд:
    [self  performSelector:@selector(printArray) withObject:nil afterDelay:5];


Более быстрый способ запуска потоков через dispatch_queue и блоки:

dispatch_queue_t queue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(queue, ^{ код потока });


Полезная функция для фиксирования времени выполнения потока
        double startTime=CACurrentMediaTime();

Вывод имени текущего потока и времени  его работы
            NSLog(@"Thread: %@ finished in %@",[[NSThread currentThread] name],@( CACurrentMediaTime()-startTime));



Вывод имени потока и его типа( главный или фоновый):
        NSLog(@"%@ started. This is %@ thread",[[NSThread currentThread] name],[[NSThread currentThread] isMainThread]?@"Main":@"Background");


Потоки лучше заключать в авторелизпул:
   @autoreleasepool { }

Для синхронизации потоков при обращении к общему ресурсу можно использовать:
@synchronized(self) {}

Файлы проекта урока 13 Многопоточность.

Домашнее задание к 13 уроку.
Ученик.

1. Создайте класс студент. У него должен быть метод - угадать ответ :)
2. В метод передается случайное целое число например в диапазоне от 0 - 100 (или больше) и сам диапазон, чтобы студент знал где угадывать
3. Студент генерирует случайное число в том же диапазоне пока оно не будет искомым
4. Весь процесс угадывания реализуется в потоке в классе студент
5. Когда студент досчитал то пусть пишет в НСЛог
6. Создайте 5 студентов и дайте им одну и туже задачу и посмотрите кто справился с ней лучше

Студент.

7. Задача та же, но вместе с условием передавайте студенту блок, в котором вы и объявите результаты
8. Блок должен определяться в томже классе, где и определялись студенты
9. Блок должен быть вызван на главном потоке

Мастер.

10. Создать приватный метод класса (да да, приватный метод да еще и с плюсом), который будет возвращать статическую (то есть одну на все объекты класса студент) dispatch_queue_t, которая инициализируется при первом обращении к этому методу.
11. Лучше в этом методе реализовать блок dispatch_once, ищите в инете как и зачем :) А что, программист всегда что-то ищет и хороший программист всегда находит.
12. Все студенты должны выполнять свои процессы в этой queue и она должна быть CONCURRENT, типа все блоки одновременно выполняются

Супермен.

13. Добавьте еще один класс студента, который делает все тоже самое что вы реализовали до этого, только вместо GCD он использует NSOperation и NSOperationQueue. Вообще вынос мозга в самостоятельной работе :)
14. Все сделавшие Мастера и Супермена и с красивым кодом получают отдельный огромный РЕСПЕКТ, так как они это на самом деле заслуживают.

Выполнил задания для ученика, студента, мастера и супермена.
Код домашнего задания к уроку 13 Многопоточность.


Комментариев нет:

Отправить комментарий