Вопрос или проблема
Я пытаюсь выполнить 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 {
// Ваша реализация
}
Пояснения:
-
Последовательность выполнения: Использование
await
перед каждой функцией (func1()
,func2()
,func3()
) гарантирует, что следующая функция начнется только после завершения предыдущей, что соответствует вашим требованиям. -
Обработка ошибок: Добавление блока
do-catch
позволяет перехватывать любые ошибки, которые могут возникнуть во время выполнения асинхронных функций. Это важно, особенно в случае обработки данных, поскольку сетевые запросы могут завершаться ошибками. -
Асинхронные функции: Каждая из функций
func1()
,func2()
иfunc3()
объявляется какasync throws
, что позволяет им выбрасывать ошибки. Это дает возможность вам обрабатывать потенциальные проблемы, возникающие при декодировании данных. -
Избежание предупреждений компилятора: Устранение использования массива для вызова функций решает проблему с предупреждениями компилятора о неиспользуемых выражениях и отсутствии асинхронных операций внутри
await
.
Заключение
Таким образом, следуя предложенному подходу, вы сможете корректно и без предупреждений вызывать ваши функции последовательно. Это не только улучшит структуру вашего кода, но и сделает его более устойчивым к ошибкам, что особенно важно при работе с внешними источниками данных.