Всем привет! В этом видео мы начнем рассказывать о другой технологии Apple для реализации многопоточности OperationQueue. Сравним ее с уже известной Grand Center Dispatch, а также расскажем о том, в каких случаях выгоднее использовать OperationQueue, а в какие GCD. Начнем с терминов, которые мы будем использовать. OperationQueue является высокоуровневой оберткой DispatchQueue, с дополнительной функциональностью, в виде установления зависимости между операциями. Операция (Operation) представляет собой законченную задачу, является абстрактным классом, предоставляющим потоко-безопасную структуру для моделирования состояния операции, ее приоритета, зависимости от других операций и управление этой операцией. На очереди OperationQueue можно добавить операцию или любой ее subclass, замыкание или даже целый массив операций. Давайте рассмотрим теперь с вами сходства и различия, OperationQueue и Grand Center Dispatch. У OperationQueue и GCD существуют общая функциональность, вследствие того, что OperationQueue является высокоуровневой оберткой на Grand Center Dispatch. Можно сказать, что используя OperationQueue мы косвенным образом используем DispatchQueue. Сходство первое, синхронное и асинхронное размещение задач на очереди - одинаковое. Второе, одинаковое использование приоритетов. Третье, OperationQueue может вести себя как DispatchGroup, и дожидаться выполнения всех поставленных в очередь операций. Четвертая, возможность отмены поставленных в очередь операций, в Grand Center Dispatch доступна только при использовании Dispatch Work Item. Пятое, качество обслуживания может быть указано, как для очереди, так и для каждой конкретной операции. GCD только при использовании Dispatch Work Item. Теперь различия. Первое различие это порядок выполнения задач в очереди. В отличие от очередей DispatchQueue, где все задачи выполняются согласно паттерну FIFO OperationQueue, операции выполняются согласно своему статусу готовности, в зависимости от других операций, качеству обслуживания и порядку добавления в очередь. К примеру, если задача была добавлена в очередь четвертой по счету, но первой перешла в статус готовности, при этом ее выполнение не зависит от завершения других операций, то она будет выполнена первой. Об операциях и их статусах мы будем подробно говорить в следующем видео. Второе различие. Одним из преимуществ OperationQueue является использование зависимостей (dependency), возможность установить зависимость начала выполнения одной операции от успешного завершения другой. Если операция добавленная в зависимость не завершится, то другая операция не будет принята к выполнению. Третье - возможность управления количеством одновременно выполняемых операций. У OperationQueue есть возможность установить количество одновременно выполняемых операций на очереди. Четвёртое, у OperationQueue и Operation есть ряд свойств, совместимых с обзор Queue и KVC, позволяющих отслеживать в каком статусе находится выполнение операций. Пятое, в Grand Centre Dispatch существуют глобальные очереди, созданные Apple по умолчанию и готовые к использованию из коробки. При использовании OperationQueue необходимо всегда создавать очереди самим. Так когда же лучше использовать Operation Queue, а когда GCD? Если нам необходимо выполнить небольшой блок кода в фоновом потоке, то проще использовать Dispatch Queue, так как это потребует написания меньшего кода в сравнении с OperationQueue. Dispatch Queue проще использовать для обновления пользовательского интерфейса после завершения операции на фоновые очереди. Также GCD проще использовать для размещения задач асинхронно на очередь, а также в применении семафоров и барьеров. С другой стороны, если перед нами стоит задача, в которой необходимо использовать дополнительные функционал OperationQueue такой как зависимости. Создать собственный subt класс операций c переопределением методов или управлять состоянием операций, то лучше использовать OperationQueue. Теперь давайте рассмотрим с Вами API класса OperationQueue. API этого класса представляет собой широкую функциональность в сравнении с API DispatchQueue. Вы это видите на слайде. В данном API представлены инициализатор очереди и два свойства current и main, представляющие собой текущую очередь и главную очередь. Главная очередь OperationQueue используется для обновления пользовательского интерфейса аналогично с DispatchQueue. В отличие от DispatchQueue в API OperationQueue представлено важное свойство maxConcurrentOperationCount, позволяющая ограничивать максимальное количество одновременно выполняемых операций в очереди. Если мы установим maxConcurrentOperationCount равный единице, то наша очередь станет последовательной. По умолчанию maxConcurrentOperationCount проще аккаунт равно дефолт без ограничения, что превращает нашу очередь в параллель. Операция, размещенная на OperationQueue выполняются асинхронно, аналогично DispatchQueue Data Swift. Метод CancelOPeration позволяет послать сообщение отмены всем операциям, находящимся на очереди. Метод waitUntilAllOperationsAreFinished позволяет заблокировать текущий поток и дождаться завершения всех операций на потоке. Так в этом видео мы познакомились с классом OperationQueue, изучили его API, рассмотрели сходства и различия с GCD. В следующем уроке мы будем рассказывать о классе Operation.