Sobes.tech
Junior — Middle

Ի՞նչ տարբերություններ կան async/await և ավարտման handlers-ների օգտագործման միջև երբ աշխատում եք ասինխրոնային կոդով։

sobes.tech AI

Պատասխան AI-ից

iOS-ում ասինխրոն կոդի հետ աշխատելիս հիմնական տարբերությունները async/await և ավարտման հսկիչների միջև.

  • Սինտաքս և ընթերցելիություն: async/await թույլ է տալիս գրել ասինխրոն կոդը հաջորդական ոճով, ինչը բարելավում է ընթերցելիությունը և հեշտացնում է սխալների հայտնաբերումը: Ավարտման հսկիչները օգտագործում են ներսի փակագծեր, ինչը կարող է հանգեցնել "callback դժոխքի":

  • Սխալների կառավարում: async/await-ով կարելի է օգտագործել սովորական try/catch մեխանիզմը սխալների կառավարում համար, մինչդեռ ավարտման հսկիչներում սխալները սովորաբար փոխանցվում են պարամետրերով, ինչը պահանջում է լրացուցիչ ստուգումներ:

  • Համատեղելիություն: async/await-ը աջակցվում է Swift-ով starting from version 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-ը պարզեցնում է ասինխրոն աշխատանքը, դարձնում այն ավելի հասկանալի և հարմար։