Что лучше сделать вызов Coroutine в репозитории или ViewModel? - PullRequest
1 голос
/ 13 марта 2019

Просто удивляюсь мнению других, у меня есть 2 способа сделать что-то, и мне было любопытно, что лучше (и, надеюсь, почему вы так думаете)

У меня есть 2 файла WordRepository и WordViewModel. Я могу сделать сопрограммы в Repo или в ViewModel в обоих направлениях, но надеюсь, что кто-нибудь подскажет, почему я должен делать сопрограммы в том или ином и наоборот.

Версия А. (Где сопрограмма в репо)

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)
            }
        }

}

1 Ответ

1 голос
/ 13 марта 2019

Честно говоря, я думаю, что в любом случае все в порядке, но если мне нужно выбрать, я предпочитаю хранить связанный с потоками код на уровне хранилища. ( Версия A в примере)

Мое оправдание:

(A) Представление Модели не должны предполагать, как репозитории внутренне работают. Версия B подразумевает, что модель представления предполагает, что репозиторий будет работать в вызывающем потоке.

(B) Кроме того, хранилище не должно зависеть от других компонентов, использующих определенный поток для вызова своего метода. Хранилище должно быть завершено само по себе.

(C) Чтобы избежать дублирования кода. Наличие нескольких моделей View, вызывающих один метод репозитория, - очень распространенная ситуация. Версия A выигрывает в этом случае, потому что вам нужен только Corountine в одном месте, хранилище.


Я предлагаю взглянуть на некоторые примеры Google, чтобы узнать, где им нравится обрабатывать Coroutine и коды доступа к данным.

  1. Подсолнух использует код Coroutine в своем хранилище. Это, вероятно, особенно полезно для вас, поскольку содержит примеры запросов типа «забей и забудь».

  2. GitHubBrowserRepo не использует Coroutine, но в хранилище хранятся ссылки на Executor экземпляров, которые используются при доступе к данным.

...