Блог :. AsyncTask для Swift - хелпер для превращения синхронного кода в асинхронный

AsyncTask для Swift - хелпер для превращения синхронного кода в асинхронный

26 Сен, 2017

Представим, что у нас бывают тяжеловатые задачи, которые на некоторое время заметно блокируют UI приложения. Например, это может быть чтение и десериализация какого-нибудь JSON-файла из Bundle на старте приложения. Для заметного ускорения можно разгрузить главный runloop приложения, а также задействовать для решения задачи другие свободные ядра процессора на смартфоне.

Для этого нам поможет класс-хелпер, чем-то напоминающий Promise, но без возможности зафейлиться, т.е. результат будет возвращаться всегда. Базироваться он будет на DispatchQueue, где в глобальной очереди будет исполнятся сама задача, а результат возвращаться в главную очередь обратно.


Как пользоваться?

А вот пользоваться получается очень удобно:

async {

    print("heavy task impl");

}.then {

    print("perform UI updates");

}

Если же функция имеет возвращаемый результат, то выглядеть метод, например асинхронной загрузки изображения из интернета, будет таким образом:

А использовать вызов этой фунции одно удовольствие: никакого вложенного спагетти из кода между DispatchQueue

loadImageAsync(url).then { image in
    imageView.image = image;
}