У меня есть метод протокола:
func do() async throws
В реализации я должен вызвать одну функцию something(), возвращающую AnyPublisher<Void, Error>:
func something() -> AnyPublisher<Void, Error>
Как должно выглядеть мое do() тело, чтобы преобразовать AnyPublisher<Void, Error> возвращаемое значение в async throws?
func do() async throws
{
try await ??? something()
}





Вы можете превратить Publisher в AsyncSequence, используя свойство values .
Если вас интересует только следующее публикуемое значение, вы можете просто создать асинхронный итератор и вызвать next:
let publishedValues = something().values
var iterator = publishedValues.makeAsyncIterator()
try await iterator.next()
print("Waiting Done!")
Это будет ждать, пока издатель не опубликует свое следующее значение или не завершит публикацию, в зависимости от того, что наступит раньше.
Если вас волнует более одного значения, вы можете использовать цикл for:
for try await _ in publishedValues {
// this gets run for each value that is published
}
Этот цикл завершится, когда издатель завершит работу.