У меня есть функция, которая возвращает мне AgentEntity
, она сначала проверяет базу данных Realm и возвращает объект, если она уже есть в базе данных. Если объект не найден, вызывается функция REST API для получения данных, помещения их в базу данных и их возврата. Мой код:
suspend fun getAgent(id: String): AgentEntity {
// Worker thread val realm = Realm.getDefaultInstance() val agent = realm.where(AgentRealmModel::class.java)
.equalTo("id", id)
.findFirst() return if (agent != null) {
AgentEntity(agent)
} else {
val agentResponse = apiService.api.getAgentsInfo(
AgentRequest(listOf(id))
).await() val realmModel = AgentRealmModel(agentResponse) realm.executeTransaction { // throws Exeception, because Realm was created in another thread
it.insert(realmModel)
} AgentEntity(realmModel)
}
}
Я использую Kotlin Coroutines, и эта функция приостановки вызывается из Dispatchers.Default
пула потоков.
Проверьте комментарии в моем код. Когда я пытаюсь вызвать realm.executeTransaction
, выдается исключение, потому что после вызова apiService.api.getAgentsInfo().await()
поток был изменен и не был изменен обратно. Можно ли остаться в одной теме? Я не хочу создавать новый экземпляр Realm, потому что это занимает много времени, было бы довольно удивительно, просто использовать тот же поток.