Запуск 3 функций последовательно, каждая из которых выполняется по завершении предыдущей функции.

Вопрос или проблема

Я пытаюсь выполнить 3 функции последовательно, чтобы каждая функция завершилась перед тем, как начнется следующая. Приведенный ниже код работает хорошо, но я получаю три предупреждения: 1) В выражении ‘try’ нет вызовов функций, выбрасывающих исключения, 2) В выражении ‘await’ нет операций с ‘async’, 3) Выражение типа ‘[()]’ не используется. Предупреждения отображаются на этой строке “try await [one, two, three]”

Есть ли какие-либо предложения по правильному способу кодирования этого и устранению этих предупреждений?

Task {
        let one: () = await func1()
        let two: ()  = await func2()
        let three: ()  = await func3()
        try await [one, two, three]
      }

 func func1() async {
...
 }

func func2() async {
 ...
 }

func func3() async {
 ...
 }

Функции по сути декодируют данные JSON из отдельных внешних источников, а затем выполняются вычисления на основе полученных результатов, поэтому важно, чтобы каждое декодирование происходило до начала следующего

Это просто:

Task {
    await func1()
    await func2()
    await func3()
}

Это выполнит их последовательно. Просто будьте осторожны, чтобы не вводить дополнительную несструктурированную конкурентность (Task {…}) в этих функциях.

Ответ или решение

Для выполнения трех асинхронных функций последовательно в языке Swift, рекомендуется использовать ключевые слова await без создания лишних конструкций, таких как массивы. Основная задача состоит в том, чтобы убедиться, что каждая функция завершается, прежде чем будет запущена следующая. Ваше исходное решение генерирует предупреждения, потому что вы пытаетесь использовать try await на массиве, который не требует обработки ошибок и не является корректным для данной ситуации.

Вот правильный и оптимизированный способ организации кода:

Task {
    do {
        try await func1()
        try await func2()
        try await func3()
    } catch {
        print("Произошла ошибка: \(error)")
    }
}

func func1() async throws {
    // Ваша реализация
}

func func2() async throws {
    // Ваша реализация
}

func func3() async throws {
    // Ваша реализация
}

Пояснения:

  1. Последовательность выполнения: Использование await перед каждой функцией (func1(), func2(), func3()) гарантирует, что следующая функция начнется только после завершения предыдущей, что соответствует вашим требованиям.

  2. Обработка ошибок: Добавление блока do-catch позволяет перехватывать любые ошибки, которые могут возникнуть во время выполнения асинхронных функций. Это важно, особенно в случае обработки данных, поскольку сетевые запросы могут завершаться ошибками.

  3. Асинхронные функции: Каждая из функций func1(), func2() и func3() объявляется как async throws, что позволяет им выбрасывать ошибки. Это дает возможность вам обрабатывать потенциальные проблемы, возникающие при декодировании данных.

  4. Избежание предупреждений компилятора: Устранение использования массива для вызова функций решает проблему с предупреждениями компилятора о неиспользуемых выражениях и отсутствии асинхронных операций внутри await.

Заключение

Таким образом, следуя предложенному подходу, вы сможете корректно и без предупреждений вызывать ваши функции последовательно. Это не только улучшит структуру вашего кода, но и сделает его более устойчивым к ошибкам, что особенно важно при работе с внешними источниками данных.

Оцените материал
Добавить комментарий

Капча загружается...