755просмотров
26.0%от подписчиков
2 марта 2026 г.
Score: 831
Поделюсь немного опытом переезда на async/await в пет проекте. ⚠️ UIKit монолит 2019 года — 80% кода на completion handlers. Переписывать всё под async/await казалось адом. Решил идти постепенно: withCheckedContinuation + @MainActor class LegacyAPI { func fetchUser(completion: @escaping (Result<User, Error>) -> Void)
} // Обёртка:
extension LegacyAPI { @MainActor func fetchUser() async throws -> User { try await withCheckedThrowingContinuation { cont in fetchUser { result in cont.resume(with: result) } } }
} ✔️ Правило: новая публичная функция — async, старая остаётся для legacy. Ключевые приёмы: ➡️ @MainActor на extension — UI обновления без GCD хаоса ➡️ Task { @MainActor in ... } для контроллеров ➡️ async let для параллельного нетворкинга ➡️ Actor для shared state (UserSettings → @globalActor) 😮 До/После: // Было (callback hell)
fetchUser { user in fetchPosts(userId: user.id) { posts in self.tableView.reloadData() }
} // Стало
let user = try await api.fetchUser()
let posts = try await api.fetchPosts(userId: user.id)
await MainActor.run { tableView.reloadData() } 💯 Получилось неплохо. Конечно, не без всяких моментов, но зато код читается в разы лучше теперь. Делитесь опытом, кто с чем боролся больше всего?