Bagaimana cara menegakkan agar suatu fungsi harus dipanggil dengan coroutine?

Apakah ada cara untuk membuat suatu fungsi harus dipanggil dengan coroutine dalam lingkup IO?

Saya rasa saya bisa melakukannya

suspend fun f() {}

Tapi mungkin ada penjelasan untuk ini?

Bagaimana jika saya masih ingin fungsi tersebut diblokir? Karena di dalam fungsi saya biasanya melakukan panggilan db.


person J_Strauton    schedule 28.04.2020    source sumber


Jawaban (1)


Jika ini adalah fungsi penangguhan, pastinya hanya dapat dipanggil dari coroutine.

Adapun untuk mengharuskannya dipanggil dalam cakupan IO, Anda dapat menginstal sendiri operator IO:

suspend fun f() = withContext(Dispatchers.IO) { ... }

...atau, jika Anda benar-benar ingin menolak pengguna mana pun yang tidak menggunakan operator IO, Anda dapat menulis require(coroutineContext[CoroutineInterceptor] == Dispatchers.IO), tetapi saya tentu menganggapnya sangat aneh sebagai pengguna.

person Louis Wasserman    schedule 28.04.2020
comment
Ke mana require(coroutineContext[CoroutineInterceptor] == Dispatchers.IO) itu akan dimasukkan ke dalam kode? - person J_Strauton; 28.04.2020
comment
@J_Strauton jika Anda menulis fungsi seperti yang disarankan di atas menggunakan withContext(Dispatchers.IO) { // your code } ini sudah cukup. Fungsi penangguhan akan berjalan pada thread yang berasal dari operator IO. - person Stefan Zhelyazkov; 28.04.2020
comment
@J_Strauton itu akan menjadi baris pertama dari fungsi penangguhan Anda. - person Louis Wasserman; 28.04.2020