Простой пример NSBlockOperation

П

Swift 2.2

Параллелизм — очень интересная тема, и есть много ситуаций, когда вы должны использовать его в приложении. Иногда это единственный способ обеспечить отзывчивый интерфейс для пользователя. В Swift на данный момент нет «родных» функций для обеспечения параллелизма, однако iOS SDK предоставляет различные API для параллельной обработки. В этой статье мы рассмотрим простой пример с использованием NSBlockOperation. Что бы лучше понимать суть статьи, советую почитать о жизненном цикле приложения.

Простой пример NSBlockOperation: Сценарий

Мы хотим вычислить сумму чисел от 1 до 1000000000. Конечно, мы бы могли вычислить их таким образом:

Тем не менее в большинстве случаев у вас может не быть таких «лайфхаков» и вам нужно будет считать трудным путем… Так что выберем другой подход. Мы хотим пересчитать все числа, прибавляя их. К сожалению, это занимает некоторое время, так что пользовательский интерфейс будет заблокирован при выборе этого подхода, пока процесс подсчета и сложения не завершится.  Следовательно, единственный способ обеспечить отзывчивый пользовательский интерфейс — выполнять его и подсчет одновременно. Во время расчетов нам понадобится индикатор активности, что бы показать пользователю, что что то происходит. После расчета результат должен быть отображен в Lablel, а индикатор должен остановиться.

Простой пример NSBlockOperation: Реализация

Как было сказано ранее, существуют различные API — интерфейсы параллелизма. Вы можете использовать Grand Central Dispatch (GCD), или же вы можете использовать NSThread, что не есть хорошо, так как это очень низкий уровень. Другой вариант — использование NSOperation. Существуют различные способы его использования. Мы будем использовать NSBlockOperation. С ним вы сможете определить блок кода, который должен быть выполнен в NSOperationQueue по вашему выбору.

Итак, давайте начнем с создания NSBlockOperation, добавляющий наши цифры:

Это просто блок, который, что бы его код выполнился, должен быть вставлен в инициализатор NSOperationQueue. Но для начала нам нужно его создать:

Все операции, добавленные в эту очередь, не будут выполнятся в главном потоке. Это значит, что пользовательский интерфейс, работающий в главном потоке, ничего не заблокирует. Давайте добавим наш блок кода в очередь:

Теперь у нас есть почти все что нам нужно. Кроме одной детали. После вычислений мы хотим отобразить результат. Мы должны сделать это внутри операции блока, потому что мы не знаем, как долго будут производиться расчеты. И кстати: не смейте даже пытаться работать и интерфейсом не в главном потоке — это плохо кончится для приложения. UIKit не умеет работать с потоками. Давайте создадим еще один блок, и пусть он будет выполняться в главной очереди:

В целом, ViewController будет выглядеть так:

Не забудьте только связать код с элементами в Storyboard.

Проект из этой небольшой демонстрации вы можете скачать на нашем Github!

И кстати — результат 500000000500000000 =)

Поддержите ресурс blog.justDev:

Сведения об авторе

Игорь Малеваный

1 комментарий

Instagram

Поддержите ресурс blog.justDev:

Свежие записи

Рубрики