AsyncTask для Swift - хелпер для превращения синхронного кода в асинхронный
Представим, что у нас бывают тяжеловатые задачи, которые на некоторое время заметно блокируют 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;
}