Kotlin 启动协同程序的单一方法

Kotlin 启动协同程序的单一方法,kotlin,kotlin-coroutines,Kotlin,Kotlin Coroutines,我有一个与RoomDB对话的StorageRepository,还可以共享Pref。我希望这种通信通过IO线程上的单个方法进行。我一直这样做到现在- class StorageRepository(private val coroutineDispatcher: CoroutineContext = Dispatchers.Main ) : CoroutineScope { private val job = Job() override val coroutineConte

我有一个与RoomDB对话的StorageRepository,还可以共享Pref。我希望这种通信通过IO线程上的单个方法进行。我一直这样做到现在-

class StorageRepository(private val coroutineDispatcher: CoroutineContext = Dispatchers.Main
) : CoroutineScope {

    private val job = Job()

    override val coroutineContext: CoroutineContext
        get() = job + coroutineDispatcher

    override fun storeUserDetails(userDetails: UserDetails) {
        roomDB.store(userDetails)
    }

    override fun storeTimeStamp(timeStamp: String) {
        sharedPrefs.store(timeStamp)
    }

    private fun executeAllOpsOnIOThread() = launch {
        withContext(Dispatchers.IO) {
            //Any DB write, read operations to be done here
        }
    }
}

我的问题是如何将roomDB.storeuserDetails和sharedPrefs.storetimeStamp传递给executeAllOpsOnIOThread,以便所有的DB通信都在IO线程上进行?

嗯。。也许我误解了您的意思,但似乎您可以将一段代码作为lambda函数传递,如下所示:

class StorageRepository(
    private val coroutineDispatcher: CoroutineContext = Dispatchers.Main
) : CoroutineScope {

    private val job = Job()

    override val coroutineContext: CoroutineContext
        get() = job + coroutineDispatcher

    override fun storeUserDetails(userDetails: UserDetails) = executeAllOpsOnIOThread {
        roomDB.store(userDetails)
    }

    override fun storeTimeStamp(timeStamp: String) = executeAllOpsOnIOThread {
        sharedPrefs.store(timeStamp)
    }

    private fun executeAllOpsOnIOThread(block: () -> Unit) = launch {
        withContext(Dispatchers.IO) {
            block()
        }
    }

    //async get
    fun getTimestamp(): Deferred<String> = getOnIOThread { sharedPrefs.getTime() }

    private fun <T> getOnIOThread(block: () -> T):Deferred<T> = async {
        withContext(Dispatchers.IO) {
            block()
        }
    }
}

谢谢,这很好:但是当我有一个read方法返回一个值时,它是如何工作的呢。。。例如returnTimeStamp我喜欢这个val-timestamp=executeAllOpsOnIOThread{sharedPrefs.getTime}返回时间戳,但它说需要返回字符串,但找到了JobCool!谢谢,这是最后一个问题,对不起。有了这个Deferred,如果我使用wait来获取实际的字符串,它表示我只能使用wait from suspend函数。我怎么能这么做?对不起我自己找到的: