Реализация пользовательской асинхронной последовательности в Swift
Представьте, что я хочу создать функцию, которая по заданному массиву чисел вычисляет квадрат, куб и четвертую степень каждого числа асинхронным способом и возвращает сглаженную асинхронную последовательность всех этих результатов.
Так, например, для входного массива[2, 3, 4]
, он должен вернутьAsyncSequence
экземпляр, дающий элементы[4, 8, 16, 9, 27, 81, 16, 64, 256]
.
Тогда скажем, вместо вычисленияx^2, x^3, x^4
, я хотел бы, чтобы он вычислялx, x^2, x^3, ..., x^k
гдеk
является своего рода случайным целым числом, которое может быть различным для каждого x и заранее неизвестно (его значение становится известным только при вычислении степеней). Как бы я реализовал такой шаблон?
1 ответ
АнAsyncStream
мог сделать работу. Например, если задан массив целых чисел,values
, асинхронная последовательность будет такой:
let stream = AsyncStream<Int> { continuation in
Task.detached {
for value in values {
var result = value
for _ in 1 ..< n {
result *= value
continuation.yield(result)
}
}
continuation.finish()
}
}
Но это вычисление x², x³, ..., xⁿ для каждого элемента входного массива может не подходить для асинхронной последовательности. Каждое последующее значение может быть вычислено почти мгновенно (просто умножив ранее выданное значение на x ) и, как таковое, вероятно, должно быть просто стандартной синхронной последовательностью.
Как правило, асинхронные последовательности должны быть достаточно медленными, чтобы оправдать их перемещение в фоновый режим или иным образом иметь результаты, которые выдаются асинхронно с течением времени.