Middle
Jakiego obsługi końcowego napisałeś?
sobes.tech AI
Odpowiedź od AI
Napisałem wiele obsługiwaczy zakończenia dla różnych zadań, w tym:
- Przetwarzanie wyników żądań sieciowych (pobieranie danych, stan wykonania).
- Asynchroniczne operacje na bazie danych (zapisywanie, odczyt, aktualizacja).
- Operacje systemu plików (czytanie, pisanie, usuwanie).
- Animacje i interfejsy użytkownika (zakończenie animacji, obsługa gestów użytkownika).
- Niestandardowe operacje asynchroniczne z możliwością przekazywania wyników i błędów.
Na przykład, podczas pracy z URLSession często używam takiego wzorca:
URLSession.shared.dataTask(with: url) { data, response, error in
if let error = error {
// Obsługa błędu
completion(.failure(error))
return
}
guard let httpResponse = response as? HTTPURLResponse,
(200...299).contains(httpResponse.statusCode),
let data = data else {
// Obsługa nieprawidłowej odpowiedzi lub danych
completion(.failure(URLError(.badServerResponse)))
return
}
// Udane przetwarzanie danych
do {
let model = try JSONDecoder().decode(SomeModel.self, from: data)
completion(.success(model))
} catch {
// Obsługa błędu dekodowania
completion(.failure(error))
}
}.resume()
gdzie completion to closure typu (Result<SomeModel, Error>) -> Void. Użycie Result pozwala wyraźnie rozróżnić pomiędzy pomyślnym zakończeniem a błędem.