Трудно сказать, где проблема, потому что код неполный.
Например, здесь:
return localRouteSource.saveRoute(route)
.flatMap { localID ->
route.routeId = localID
remoteRouteSource.saveRoute(route)
}
.flatMapCompletable { localRouteSource.updateRouteID(route.routeId, it) }
Полагаю, localRouteSource.saveRoute()
использует интерактор, который вы нам показываете, но неясно, как реализованы remoteRouteSource.saveRoute()
или localRouteSource.updateRouteID()
.
они также должны быть подписаны в потоке ввода-вывода.
Как правило, вы должны переключать нити, когда ЗНАЕТЕ, что вам это нужно.
Другими словами, вы должны использовать subscribeOn()
в тех местах, где вы знаете, что делаете ввод-вывод как можно ближе к реальной работе. Вместо этого ObserveOn должен использоваться, когда вы знаете, что вам нужно получить эти результаты в потоке пользовательского интерфейса и что вы можете получить в каком-то другом потоке.
в вашем примере абсолютно не нужно использовать observeOn(MAIN_THREAD)
, единственный раз, когда он вам нужен (я полагаю), это когда вы хотите показать результат.
Пара других вещей:
Этот код
override fun createCompletable(data: Map<String, Any>?): Completable {
val routeEntity = data?.get(PARAM_ROUTE)
routeEntity?.let {
return routeRepository.saveRoute(routeEntity as Route)
} ?: return Completable.error(IllegalArgumentException("Argument @route must be provided."))
}
он оценивается во время, когда вызывается метод, а не когда подписка завершается.
Другими словами, он нарушает контракт Rx и вычисляет data?.get(PARAM_ROUTE)
при вызове метода. Если он неизменный, нет большой разницы, но если он может изменить значение во время выполнения, он должен быть заключен в Completable.defer { }
Наконец, здесь
.flatMap { localID ->
route.routeId = localID
remoteRouteSource.saveRoute(route)
}
вы модифицируете что-то вне цепочки (route.routeId = localID
), это называется побочным эффектом.
будьте осторожны с такими вещами, Rx построен так, чтобы его было безопаснее использовать с неизменяемыми объектами.
Лично я бы не возражал, если вы понимаете, что происходит и когда это может создавать проблемы.