Coroutine Scope Functions
Learn about the coroutine scope function.
We'll cover the following...
We'll cover the following...
Imagine that we need to concurrently get data from two (or more) endpoints in a suspending function. Before we explore how to do this correctly, let’s see some suboptimal approaches.
Approaches used before coroutine scope functions
The first approach is calling suspending functions from a suspending function. The problem with this solution is that it’s not concurrent (for example, if getting data from each endpoint takes one second, a function will take two seconds instead of one).
Press + to interact
// Data loaded sequentially, not simultaneouslysuspend fun getUserProfile(): UserProfileData {val user = getUserData() // (1 sec)val notifications = getNotifications() // (1 sec)return UserProfileData(user = user,notifications = notifications,)}
The easiest way to make two suspending calls concurrently is by wrapping them with async
. However, async
requires a scope, and using GlobalScope
is not a good idea.
Press + to interact
//DOING THIS IS NOT RECOMMENDED AT ALLsuspend fun getUserProfile(): UserProfileData {val user = GlobalScope.async { getUserData() }val notifications = GlobalScope.async {getNotifications()}return UserProfileData(user = user.await(), // (1 sec)notifications = notifications.await(),)}
The GlobalScope
...