kotlin 我应该如何保存一个文件,使它不会挂起主线程,但也不会覆盖陈旧的数据

2uluyalo  于 2023-08-06  发布在  Kotlin
关注(0)|答案(1)|浏览(109)

所以我正在使用Jetbrains Desktop Compose开发一个应用程序,我已经达到了一个停滞状态,我不知道应该使用什么方法来保存信息。我需要它自动保存每当一个变化。我的方法是写一个保存函数,我可以在我使用的对话框上的提交按钮之后调用它,以便用户更改对象。也许有一个更好的方法,我看,如果对象已被更改,但这是除了点。
问题本身就是这样。如果我用一个巨大的对象调用保存函数,然后必须将其转换为JSON并输出到一个文件,主线程可能会挂起并导致整个应用程序变得无响应。解决方案是异步执行,但这引入了第二个问题:如果两个保存请求紧密地发生,则第一个保存请求可能被延迟,而第二个保存请求通过,此时它将用其旧的陈旧数据覆盖该文件,并且如果用户关闭而没有再次保存,则该数据将丢失。我想做的是将其设置为队列,以便如果新的保存请求在前一个保存请求完成之前进入,则新的保存请求将等待,直到旧的保存请求完成。我已经看过了所有的文档,我可以找到,但它的不可能,我工作出什么功能是必要的。我不知道我是否需要使用Jobs、promise、channels,或者Kotlin拥有的其他各种与协程相关的特性。
有什么想法吗?

cidc1ykv

cidc1ykv1#

我想最简单的解决方案是使用互斥体

val mutex = Mutex()

susped fun saveData(data: String) = mutex.withLock {
    // TODO: save data
}

字符串
另一种解决方案是使用Channel,具有将要保存的数据发送到通道的协程,以及从通道读取并执行保存的不同协程注意:读取的协程应该在单个线程上运行。

相关问题