Skip to main content

What’s the difference between Sequence, AsyncSequence, and AsyncStream?

About 2 minSwiftArticle(s)bloghackingwithswift.comcrashcourseswiftxcodeappstore

What’s the difference between Sequence, AsyncSequence, and AsyncStream? 관련

Swift Concurrency by Example

Back to Home

What’s the difference between Sequence, AsyncSequence, and AsyncStream? | Swift Concurrency by Example

What’s the difference between Sequence, AsyncSequence, and AsyncStream?

Updated for Xcode 15

Swift provides several ways of receiving a potentially endless flow of data, allowing us to read values one by one, or loop over them using for, while, or similar.

The simplest is the Sequence protocol, which continually returns values until the sequence is terminated by returning nil. Lots of things conform to Sequence, including arrays, strings, ranges, Data, and more. Through protocol extensions Sequence also gives us access to a variety of methods, including contains(), filter(), map(), and others.

The AsyncSequence protocol is almost identical to Sequence, with the important exception that each element in the sequence is returned asynchronously. I realize that sounds obvious, but it actually has two major impacts on the way they work.

First, reading a value from the async sequence must use await so the sequence can suspend itself while reading its next value. This might be performing some complex work, for example, or perhaps fetching data from a server.

Second, more advanced async sequences known as async streams might generate values faster than you can read them, in which case you can either discard the extra values or buffer them to be read later on.

So, in the first case think of it like your code wanting values faster than the async sequence can make them, whereas in the second case it’s more like the async sequence generating data faster than than your code can read them.

Otherwise, Sequence and AsyncSequence have lots in common: the code to create a custom one yourself is almost the same, both can throw errors if you want, both get access to common functionality such as map(), filter(), contains(), and reduce(), and you can also use break or continue to exit loops over either of them.

Similar solutions…
How to create a custom AsyncSequence | Swift Concurrency by Example

How to create a custom AsyncSequence
How to convert an AsyncSequence into a Sequence | Swift Concurrency by Example

How to convert an AsyncSequence into a Sequence
How to manipulate an AsyncSequence using map(), filter(), and more | Swift Concurrency by Example

How to manipulate an AsyncSequence using map(), filter(), and more
How to loop over an AsyncSequence using for await | Swift Concurrency by Example

How to loop over an AsyncSequence using for await
What’s the difference between async let, tasks, and task groups? | Swift Concurrency by Example

What’s the difference between async let, tasks, and task groups?

이찬희 (MarkiiimarK)
Never Stop Learning.