Параллельные блоки


Параллельные блоки

Скомпилируйте и запустите рассматриваемое здесь приложение на выполнение, а затем нажмите кнопку. Как видите, в данном приложении кое-что изменилось к лучшему. Несмотря на то, что выполнение работы занимает несколько секунд, пользователь не остается в неведении относительно того, что происходит в приложении: кнопка явно выглядит недоступной, а оживляемая "вертушка" дает пользователю знать, что приложение не зависло и можно ожидать, что оно через некоторое время вернется к нормальной работе в диалоговом режиме.

Пока что все идет нормально, но дело еще не сделано! Возможно, от вашего зоркого ока не ускользнуло, что, внеся упомянутые выше коррективы, мы не изменили основной последовательный характер реализуемого алгоритма, если, конечно, этот простой ряд шагов можно назвать алгоритмом. Мы просто переносим часть метода doWork: в фоновый потоп, а завершаем его в основном потоке, что и подтверждает вывод на консоль Xcode: выполнение работы, как и прежде, занимает 10 секунд. Но все дело в том, что методы calculateFirstResult: и calculateSecondResult: совсем не обязательно должны выполняться последовательно, а если распараллелить их выполнение, то можно добиться существенного ускорения всего процесса.

В GCD этого можно добиться с помощью, так называемой диспетчерской группы (dispatch group). Все блоки, которые асинхронно диспетчеризуются в контексте группы, высвобождаются функцией dispatch group async () для как можно более быстрого выполнения, включая их распределение по многим потокам для параллельного выполнения. В то же время с помощью функции dispatch group notif у () можно указать дополнительный блок, который будет выполняться по завершении всех блоков в группе.

Учитывая все сказанное выше, внесите в данную версию метода doWork: изменения, зачеркнутые и выделенные ниже полужирным.

Первое затруднение, которое возникает в данном коде, заключается в том, что каждый метод расчета возвращает значение, которое требуется присвоить. По этой причине нам нужно сначала создать переменные с помощью модификатора хранения block, чтобы гарантировать доступность значений, заданных в блоках, для исполняемого в дальнейшем кода. Еще одно затруднение связано с управлением памятью.
  • Дата: 2-01-2015, 21:30

Предыдущие статьи сайта:

Понравилась статья? Ставь лайки, рассказывай друзьям!



Отзывы о статье: Параллельные блоки

Технологии, секреты и фишки Apple: Iphone, iPad, iPod