Sobes.tech
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.