Sobes.tech
Junior — Middle

Какви са разликите между използването на async/await и обработчиците за завършване при работа с асинхронен код?

sobes.tech AI

Отговор от AI

Основните разлики между async/await и обработчиците за завършване при работа с асинхронен код в iOS:

  • Синтаксис и четимост: async/await позволява писане на асинхронен код в последователен стил, което подобрява четимостта и улеснява отстраняването на грешки. Обработчиците за завършване използват вложени затваряния, което може да доведе до "адът на обратните повиквания".

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

  • Съвместимост: async/await се поддържа в Swift от версия 5.5 и iOS 15, докато обработчиците за завършване работят във всички версии.

Пример с 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)")
    } catch {
        print("Грешка: \(error)")
    }
}

Пример с обработчик за завършване:

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)")
    case .failure(let error):
        print("Грешка: \(error)")
    }
}

По този начин async/await опростява работата с асинхронен код, правейки го по-разбираем и удобен.