7
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Swift/Kotlin愛好会Advent Calendar 2022

Day 23

【Kotlin】 わからなかったCoroutineScopeを、なるべく短く理解する

Last updated at Posted at 2022-12-22

CoroutineScopeをざっくりと説明

コルーチンを起動するには、どのスコープで起動するかを指定する必要があります。このスコープこそがCoroutineScopeです。

コルーチンビルダーはCoroutineScopeの拡張関数

コルーチンを起動するにはコルーチンビルダーを使用します。このコルーチンビルダーにはlaunch()async()といった関数が存在しますが、これらはすべてCoroutineScopeの拡張関数として定義されています。

そしてすべてのsuspend関数はコルーチンで実行しないといけないので、普段ViewModelでsuspend関数を呼び出し、UiStateを更新する場合は次のように書いたりします。

viewModelScope.launch {
    val result = repository.getActivities()
    viewModelState.update {
        it.copy(
            ...
        )
    }
}

スレッドとかwithContextって何?

コルーチン内で、特定の処理を実行するときにコルーチンが起動されたときに指定されたスレッドとは別のスレッドに切り替えて処理を実行したい場合にはwithContext()を使用します。

viewModelScope.launch {
    ...
		withContext(Dispatchers.IO) {
        ...
    }
}

コルーチンで使用できるスレッドの種類

Kotlinのコルーチンでは、ディスパッチャを使ってコルーチンの実行時に使いたいスレッドを指定します。

以下では、主な3つのディスパッチャを紹介します。

Dispatachers.Main

Dispatachers.Mainはメインスレッドを表します。メインスレッドで、手早くsuspend関数を呼び出したりUIのオペレーションを実行したい場合にのみ便利です。

Dispatchers.IO

Dispatachers.IOでは、デフォルトで64スレッド存在するため、最大64スレッドの並列実行を行うことが可能となります。

しかし、名前の通り、IOがブロックされることにより多くの待ち時間が発生する可能性があります。

Dispatachers.Default

Dispatachers.Defaultは、メインスレッドの外部で、負荷の高い処理や、一極集中型のタスクを実行したい場合に向いています。しかし、実行端末のCPUのコア数の数のスレッドしか起動することはできないため注意が必要です。ただ、スリープはほとんど発生しないため、そういったメリットもあります。

参考にした記事

7
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?