Fuente
Затишна Галера | iOSКомпас 🧭1️⃣6️⃣1️⃣ Завдання 161 (PART 2)SwiftUI .task: коли треба за...
618 Vistas/Alcance
2026-07-01 10:49
Mensaje №2761
#iOSКомпас 🧭1️⃣6️⃣1️⃣ Завдання 161 (PART 2)SwiftUI .task: коли треба запускати async-код при появі view?У прикладі вище використовується init(sidebar:detail:) версія NavigationSplitView, щоб створити split view на дві колонки.На iPad використання task(id:priority:_:) для detail view тут уже критичне. Бо щойно користувач вибрав морозиво, detail view більше не з'являється заново. А це означає, що базова версія .task уже не тригерне action повторно.Якщо ж використати вибране морозиво як тригер для асинхронної дії, це обмеження можна обійти. І щоразу, коли користувач змінює вибір, detail data завантажуються знову.Саме так, як і треба.🔣 Порівняння з `.onAppear`Після ближчого знайомства з .task може виникнути логічне питання: а в чому різниця з .onAppear, який на поверхні ніби дає таку саму поведінку?Обидва модифікатори можуть запускати синхронні методи, коли view з'являється. Але .task має дві переваги:1️⃣ Нативна підтримка async/await, без потреби загортати все в Task { }2️⃣ Автоматичне скасування задачі, коли view виходить зі scope або, у випадку task(id:_:), коли змінюється id. Життя стає простішим, бо не треба вручну менеджити lifetime задачіВ обох модифікаторів є свої сценарії використання. А що саме брати - вирішувати вже вам.У цьому невеликому пості ми подивилися на три способи використання .task, щоб запускати асинхронні дії при появі view:1️⃣ task(_:) - найпростіший варіант без явно переданого priority2️⃣ task(priority:_:) - варіант із переданим priority3️⃣ task(id:priority:_:) - варіант, який автоматично скасовує і створює задачі заново, коли змінюється id@Zatishna_Galera