【发布时间】:2020-06-08 09:19:33
【问题描述】:
我有一个要映射的项目列表,然后插入到房间表中:
房间
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insert(vararg projectLocal: ProjectLocal): Completable
保存数据的FIRST方法:
Observable.fromIterable(remoteProjects)
.map { project ->
...
mProjectMapper.mapRemoteToLocal(project)
}
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe {
mProjectRepository.saveProject(it)
}
如你所见,我是 observing on -> main thread 和 subscribing on -> io
第二种保存数据的方法:
remoteProjects.forEach { remote ->
...
val project = mProjectMapper.mapRemoteToLocal(remote)
mProjectRepository.saveProject(project)
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe()
}
哪一个更有意义?有没有更好的方法来使用 RxJava 将所有这些数据保存在 Room 数据库中?
【问题讨论】:
-
我认为第一种方法更好,因为你只调用了一次 saveProject(),而在第二种方法中你最终会调用 saveProject() n 次。此外,如果您在将项目添加到数据库后不需要在 UI 上执行任何操作,则无需在主线程上观察它,因此您可以删除 .observeOn() 行.
-
@Mwasz 感谢您分享您的意见它给了我一个想法。第一个仍然多次调用
saveProject函数,除非我使用Observable.just()而不是Observable.fromIterable -
哦,是的,你是对的。一个简单的解决方案是在映射后调用
.toList()并将saveProject()方法更改为接受List<ProjectLocal>。这样,您将在整个列表中调用一次saveProject()。 -
@Mwasz 用你的逻辑发布一个答案,我很乐意接受。
标签: android kotlin android-room rx-java2