iOS. Приемы программирования
Шрифт:
7.12. Асинхронное выполнение задач с помощью операций
Постановка задачи
Требуется параллельно выполнять операции.
Решение
Воспользуйтесь операционными очередями. В качестве альтернативы можно создавать подклассы от NSOperation и откреплять новый поток в методе main.
Обсуждение
Как говорилось в разделе 7.11, операции по умолчанию работают в том потоке, который вызывает метод start. Обычно операции запускаются в основном потоке, но в
Идем дальше. Попробуем воспользоваться операционной очередью и добавим к ней две простые инициирующие операции (подробнее об инициирующих операциях рассказано в разделе 7.0). Дополнительные примеры кода, описывающие инициирующие операции, имеются в разделе 7.11. Вот объявление (.hm-файл) делегата приложения, в котором используются операционная очередь и две инициирующие операции:
А вот и внутренняя часть файла реализации делегата приложения:
Вот что происходит в реализации данного кода.
У нас есть два метода, firstOperationEntry: и secondOperationEntry:. Каждый из этих методов принимает в качестве параметра объект и выводит в окне консоли информацию об актуальном потоке, главном потоке и этом параметре. Это входные методы инициирующих операций, которые будут добавляться в операционную очередь.
Мы инициализируем два метода типа NSInvocationOperation и задаем целевой селектор в точке входа каждой операции (эти точки входа были описаны выше).
Затем инициализируем объект типа NSOperationQueue. (Он может создаваться и до того, как созданы методы входа.) Объект очереди будет обеспечивать параллелизм в работе операционных объектов. На данном этапе операционная очередь может немедленно начать (а может и не начать) запускать инициирующие операции, пользуясь их методами start. При этом очень важно помнить, что после добавления операции в операционную очередь от вас не требуется запускать операции вручную. Обеспечением запуска занимается операционная очередь.
Итак, еще раз запустим код примера и посмотрим, что же у нас на консоли:
Блестяще! Это доказывает, что инициирующие операции параллельно выполняются каждая в своем потоке и в то же время параллельно главному потоку, вообще не блокируя его. Теперь еще пару раз прогоним этот же код и посмотрим, какой вывод будет появляться в окне консоли. В таком случае вы можете получить совершенно иной результат, например:
Слово воина
1. Ведун
Фантастика:
фэнтези
рейтинг книги
Догадка Ферма
3. Луи Фронсак
Детективы:
исторические детективы
рейтинг книги
Темная сторона луны
Гидеон Фелл
Детективы:
классические детективы
рейтинг книги
Рыцарь Империи
3. Одержимый
Фантастика:
фэнтези
рейтинг книги
Еретики Дюны
5. Хроники Дюны
Фантастика:
эпическая фантастика
рейтинг книги
Первый Предтеча. Трилогия
Первый Предтеча
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
рейтинг книги
Принятие
Фантастика:
фэнтези
рейтинг книги
Цитадель
Проза:
классическая проза
рейтинг книги
Тютчев
687. Жизнь замечательных людей
Документальная литература:
биографии и мемуары
рейтинг книги
Пираты Зана (сборник)
Классика фантастического боевика
Фантастика:
боевая фантастика
рейтинг книги
Зороастр
Проза:
историческая проза
рейтинг книги
Драйв Астарты
5. Конфедерация Меганезия
Фантастика:
фэнтези
рейтинг книги