Sobes.tech
Назад к вопросам
Junior — Middle
82

Какие отличия существуют между использованием async/await и completion handlers при работе с асинхронным кодом?

Компании, где спрашивали
Вкусно и точкаВкусно и точка

Ответ от нейросети

sobes.tech AI

Основные отличия между async/await и completion handlers при работе с асинхронным кодом в iOS:

  • Синтаксис и читаемость: async/await позволяет писать асинхронный код в стиле последовательного, что улучшает читаемость и упрощает отладку. Completion handlers используют вложенные замыкания, что может привести к "callback hell".

  • Обработка ошибок: с async/await можно использовать привычный механизм try/catch для обработки ошибок, тогда как в completion handlers ошибки обычно передаются через параметры, что требует дополнительной проверки.

  • Совместимость: async/await поддерживается в Swift начиная с версии 5.5 и iOS 15, тогда как completion handlers работают во всех версиях.

Пример с async/await:

func fetchData() async throws -> Data {
    let url = URL(string: "https://example.com/data")!
    let (data, _) = try await URLSession.shared.data(from: url)
    return data
}

Task {
    do {
        let data = try await fetchData()
        print("Data received: \(data)")
    } catch {
        print("Error: \(error)")
    }
}

Пример с completion handler:

func fetchData(completion: @escaping (Result<Data, Error>) -> Void) {
    let url = URL(string: "https://example.com/data")!
    URLSession.shared.dataTask(with: url) { data, response, error in
        if let error = error {
            completion(.failure(error))
            return
        }
        if let data = data {
            completion(.success(data))
        }
    }.resume()
}

fetchData { result in
    switch result {
    case .success(let data):
        print("Data received: \(data)")
    case .failure(let error):
        print("Error: \(error)")
    }
}

Таким образом, async/await упрощает работу с асинхронным кодом, делая его более понятным и удобным.