android - Coroutine 调用放在 Repository 和 ViewModel 哪个更好?

标签 android mvvm kotlin android-room coroutine

只是想知道其他人的意见我有两种方法可以做某事并且很好奇哪个更好(希望你为什么这么认为)

我有 2 个文件 WordRepository 和 WordViewModel。我可以在 Repo 或 ViewModel 中执行协程,这两种方式都可以,但希望有人能给我一个线索,说明为什么我会在一种或另一种方式中执行协程,反之亦然。

版本 A.(协程在 Repo 中)

WordRepo:

class WordRepository(private val wordDao: WordDao): WordRepo {

    @WorkerThread
    override suspend fun deleteAllLogsOlderThan(XDays: Int): Int = withContext(IO) {
        return@withContext wordDao.deleteAll()
    }

}

WordViewModel:

class WordViewModel(private val wordRepository: WordRepo) : ViewModel() {

    fun deleteAllLogsOlderThanA(XDays:Int): Int = runBlocking {
        wordRepository.deleteAllLogsOlderThan(XDays)
    }

}

版本 B.(协程在 ViewModel 中)

Word Repo:
class WordRepository(private val wordDao: WordDao): WordRepo {

    @WorkerThread
    override suspend fun deleteAllLogsOlderThan(XDays: Int): Int = wordDao.deleteAll()

}

WordViewModel:
class WordViewModel(private val wordRepository: WordRepo) : ViewModel() {

    fun deleteAllLogsOlderThanA(XDays:Int): Int = runBlocking {
            withContext(IO) {
                wordRepository.deleteAllLogsOlderThan(XDays)
            }
        }

}

最佳答案

老实说,我认为这两种方式都可以,但如果我必须选择,我更愿意将与线程相关的代码保留在存储库层中。 (示例中的版本 A)

我的理由:

(A) View 模型不应假定存储库的内部工作方式。 版本 B 表示 View 模型假定存储库将在调用线程上运行。

(B) 此外,存储库不应依赖于其他组件来使用特定线程来调用其方法。存储库本身应该是完整的。

(C) 避免代码重复。让多个 View 模型调用一个存储库方法是一种非常常见的情况。 版本 A 在这种情况下胜出,因为您只需要在一个地方(存储库)使用 Corountine


我建议查看一些 Google 示例,看看他们喜欢在哪里处理 Coroutine 和数据访问线程代码。

  1. Sunflower在他们的存储库中使用 Coroutine 代码。这可能对您特别有用,因为它包含即发即弃类型请求的示例。

  2. GitHubBrowserRepo不使用 Coroutine,但存储库保留对访问数据时使用的 Executor 实例的引用。

关于android - Coroutine 调用放在 Repository 和 ViewModel 哪个更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55145822/

相关文章:

wpf - 从 ViewModel 绑定(bind) WPF ComboBox 的数据 - 无法更改所选项目

android - 即使使用内置的Android Studio应用程序,我也总是在Android Studio中收到错误 “Content not allowed in prolog”

android - 是否可以根据Android中的构建变体排除某些kotlin文件?

java - 有没有办法让这个脉冲数无限大?

mvvm - SwiftUI 和 MVVM : How to animate "list elements change" when view model changes the "data source" (`@Publish items` ) itself

wpf - 委托(delegate)命令和路由命令

arrays - 如何从 Kotlin JVM 的字节数组中获取无符号整数?

android - 如何在主线程上使用 Kotlin 协程 await()

java - Android:使用 FLAG ACTIVITY CLEAR TOP 时上一个 Activity 未完成

Android:如何在开始转换之前以编程方式填充 GridView?