Как устроен.task в SwiftUI
Habr ·

Вы задумывались, что такое модификатор .task {..} в SwiftUI? Со стороны это просто особый Task {..} для вью. Он и выглядит как Task {..} с точкой спереди, и это сходство сбивает с толку. Я так к нему и относился: асинхронный блок, который SwiftUI запускает при появлении вью. Документация Apple говорит, что задача живет, пока вью сохраняет идентичность (identity), и SwiftUI отменяет ее, когда вью идентичность теряет, а про появление упоминает вскользь, одной фразой «Adds an asynchronous task to perform before this view appears». Выходит, запуск при каждом появлении вью, отмена при исчезновении. Где лежит сама задача и кто держит на нее ссылку, документация не говорит. А держать задачу негде. Структура вью — это значение, SwiftUI пересоздает его при каждом пересчете body , и ссылка на Task внутри структуры умрет вместе с ней. Проверьте себя. В каких из трех случаев задача внутри .task еще работает? Читать далее