Barrier
The Barrier design pattern provides us with the ability to wait for multiple concurrent tasks to complete before proceeding further. A common use case for this is composing objects from different sources.
For example, take the following class:
data class FavoriteCharacter( Â Â Â Â val name: String, Â Â Â Â val catchphrase: String, Â Â Â Â val picture: ByteArray = Random.nextBytes(42) )
Let's assume that the catchphrase
data comes from one service and the picture
data comes from another. We would like to fetch these two pieces of data concurrently:
fun CoroutineScope.getCatchphraseAsync (     characterName: String ) = async { … } fun CoroutineScope.getPicture (     characterName: String ) = async { … }
The most basic way to implement concurrent fetching would be as follows:
suspend fun fetchFavoriteCharacter(name: String) = coroutineScope { Â Â ...