TGViewer
SwiftyGroup SwiftyGroup @swiftynew · 2.35K subscribers
Post #726 481
SwiftUI .task: как не словить гонку при загрузке данных

.task(id:) хорош для экрана, где загрузка зависит от параметра. Главное: не забыть, что старый task отменяется при смене id.

Типичный пример: экран профиля получает userID, грузит данные и должен перезапускать запрос при смене пользователя. Для этого не нужен ручной onAppear плюс отдельный флаг загрузки.

struct ProfileView: View {
let userID: User.ID
@State private var profile: Profile?
@State private var error: Error?

var body: some View {
Content(profile: profile, error: error)
.task(id: userID) {
do {
profile = try await api.profile(for: userID)
error = nil
} catch is CancellationError {
// Новый userID уже запустил следующий task.
} catch {
self.error = error
}
}
}
}

При смене userID SwiftUI отменит старую задачу и начнет новую. Это удобно для search, detail screens и preview states, где значение id описывает загрузку.

Ограничение: ваш async-код должен уважать cancellation. Если внутри обёртка над старым callback API, добавьте отмену сами или хотя бы проверяйте Task.isCancelled перед записью в state.

Источник: Apple Documentation, View.task

#Swift #SwiftUI #Concurrency #iOS #AsyncAwait
  • ❤ 1
More from @swiftynew
  1. Sep 29, 2026⚡️⚡️AI-агент съел токены и потерял контекст. Что делать? Разберемся на Mobius 2026 Autumn.…
  2. Sep 22, 2026Всем привет😎. Уже прилетел отказ от Apple: «Приложение падает при запуске». Начал проверя…
  3. Sep 17, 2026Доигрались, вайбкодеры? Apple из-за вас меняет файл проекта .pbxproj ➡️ .xcproj 📁 Раньше…
  4. Sep 16, 2026iPhone Duo Design Guidelines Подъехали подробные гайдлайны по тому, как надо адаптировать…
  5. Sep 12, 2026Xcode 27 RC уже вышел, и приложения, собранные в нём, уже можно отправлять на проверку в A…
  6. Sep 10, 2026video post
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →