Как в Swift с async/await выполнить два метода параллельно, дождаться их, затем вызвать третий метод?

Ответ

Да, для этого используется async let для запуска параллельных задач и await для ожидания их завершения. Это позволяет эффективно использовать время, пока задачи выполняются.

Пример:

func processData() async {
    // 1. Параллельный запуск двух асинхронных методов
    async let data1 = fetchFirstData()
    async let data2 = fetchSecondData()

    // 2. Ожидание завершения обеих задач
    let result1 = await data1
    let result2 = await data2

    // 3. Вызов третьего метода с результатами
    let combined = await processResults(result1, result2)

    // 4. Последующие действия
    await updateUI(combined)
}

Ключевые моменты:

  • async let создаёт child task, которая выполняется параллельно с текущей задачей
  • Порядок await не важен для параллелизма — задачи уже запущены
  • Если одна из задач завершится ошибкой, другая будет отменена
  • Для явной отмены используйте TaskGroup с обработкой ошибок

Ответ 18+ 🔞

Ну ты глянь, какая красота, блядь! Всё просто, как три копейки, а работает — овердохуища эффективно. Чтобы две задачи параллельно запустить, есть у нас такая штука — async let. Это ж не просто await, который всё тормозит, пока не допиздится. Это прям как два мужика внатуре: один пиво тащит, другой закуску, а ты сидишь и ждёшь, когда оба придут, чтобы начать жрать.

Вот смотри, как это выглядит, ёпта:

func processData() async {
    // 1. Параллельный запуск двух асинхронных методов
    async let data1 = fetchFirstData()
    async let data2 = fetchSecondData()

    // 2. Ожидание завершения обеих задач
    let result1 = await data1
    let result2 = await data2

    // 3. Вызов третьего метода с результатами
    let combined = await processResults(result1, result2)

    // 4. Последующие действия
    await updateUI(combined)
}

Суть в чём, блядь? async let — это как детскую задачку создаёт, которая пиздует параллельно с основной. Ты их запустил — и похуй, пусть работают. А потом уже, когда тебе реально нужны результаты, ты их через await выцепляешь. Порядок, в котором ты их ждёшь, вообще по барабану — они уже давно в работе, блядь.

Но есть нюанс, хитрая жопа! Если одна из этих параллельных тасков вдруг пизданулась с ошибкой, то вторая, скорее всего, тоже накрывается медным тазом — её отменят. Так что если тебе надо, чтобы они друг от друга не зависели, как два независимых мудака, то уже лезь в TaskGroup — там можно ошибки по отдельности ловить и всё такое. А так — вротберунчик, всё просто и быстро.