Например:
var body: some View {
ScrollViewReader(content: { proxy in
/* ... */
}).task {
do {
let url = URL(string: "https://example.com/data.json")!
let (data, _) = try await URLSession.shared.data(from: url)
/* ... */
} catch {
print(error)
}
}
}
Что делает модификатор .task внизу? Это для сохранения и восстановления состояния программы после разрешения запроса данных?





Ключ к миру параллелизма Swift.
Модификатор .task SwiftUI наследует контекст актера от окружающей функции. Если вы вызовете .task внутри свойства body представления, асинхронная операция будет выполняться для главного актера, поскольку View.body (полусекретно) помечено @MainActor. Однако если вы вызываете .task из вспомогательного свойства или функции, которая не аннотирована @MainActor, асинхронная операция будет выполняться в совместном пуле потоков.
Согласно Apple Docs:
Используйте этот модификатор для выполнения асинхронной задачи со временем существования, соответствующим времени жизни измененного представления. Если задача не завершается до того, как SwiftUI удалит представление или представление изменит идентичность, SwiftUI отменяет задачу.
Используйте ключевое слово
awaitвнутри задачи, чтобы дождаться завершения асинхронного вызова или дождаться значений экземпляраAsyncSequence. Например, вы можете изменить текстовое представление, чтобы запустить задачу, которая загружает контент из удаленного ресурса:
let url = URL(string: "https://example.com")!
@State private var message = "Loading..."
var body: some View {
Text(message)
.task {
do {
var receivedLines = [String]()
for try await line in url.lines {
receivedLines.append(line)
message = "Received \(receivedLines.count) lines"
}
} catch {
message = "Failed to load"
}
}
}
В этом примере используется метод lines для получения содержимого, хранящегося по указанному URL-адресу, в виде асинхронной последовательности строк. При поступлении каждой новой строки тело цикла for-await-in сохраняет строку в массиве строк и обновляет содержимое текстового представления, чтобы сообщить о последнем количестве строк.
«Это для сохранения и восстановления состояния программы после разрешения запроса данных». … Нет, модификатор представления
.taskне выполняет никаких конкретных действий по восстановлению состояния. Он просто запускает задачу от имени текущего актера с автоматической отменой, если представление закрывается (или меняет личность). Это помогает избежать ненужного внедрения неструктурированного параллелизма (например,Task {…}) и бремени, которое ложится на наши плечи.