注释
:原来
toCompletable()
不是错误,而是调用代码。调用代码使得更改此方法使其工作(或不工作)。
我有以下方法。它返回一个单曲。它起作用了。执行内部的代码,使得remotedatasource single下载数据和
doOnSuccess
运行,我可以在那里断点。
但是,如果像第二个示例那样将其转换为completable,则它将停止工作。数据没有下载,里面的代码
成功之路
永远不要跑。
我想在这个方法中将它转换为completable,因为调用这个方法的方法不需要数据,只需要成功/错误结果。
知道为什么会这样吗?
文件上说
返回{@link completable},丢弃{@link single}的结果
当这个源{@link single}调用{@code oncomplete}时
{@code onsuccess}。传播错误终端事件。
但我认为这意味着它将丢弃调用方法的东西,而不是当前方法的东西。通过转换为completable,即使是远程数据源也不会下载数据。
工作:
override fun downloadSomethingList(): Single<List<Something>> {
return remoteDataSource.getSomethingList(getHash(SOMETHING_HASH))
.doOnSuccess { it: Map<String, List<Something>>
saveHash(SOMETHING_HASH, it.keys.first())
localDataSource.replaceSomethingList(it.values.first())
}.map {
it.values.first()
}
}
破碎:
override fun downloadSomethingList(): Completable {
return remoteDataSource.getSomethingList(getHash(SOMETHING_HASH))
.doOnSuccess { it: Map<String, List<Something>>
saveHash(SOMETHING_HASH, it.keys.first())
localDataSource.replaceSomethingList(it.values.first())
}.toCompletable()
}
更新:
好的,这是我的调用方法。是的,有点复杂。可能是里面的东西引起了这个问题。
fun downloadData(): Completable {
...
return repository.downloadThing1()
.flatMap { downloadedThing1 ->
...
repository.downloadThing2().toSingle()
}
.flatMap {
repository.getThing2()
}.flatMap { thing2 ->
...
repository.saveThing1(thing1).toSingle()
}
.flatMap {
if ("some condition") {
repository.downloadThing3()
.andThen(repository.downloadThing4())
.andThen(repository.downloadThing5())
.andThen(repository.downloadThing6()).toSingle()
} else {
Completable.complete().toSingle()
}
}.toCompletable()
.doOnComplete {
...
}
}
更新2:
如果我使用下面的调用代码,它就会工作!
所以我们得到的教训是,调用代码肯定会破坏上游
. 更具体地说,我认为
toSingle()
电话。相反,我发现
flatMapCompletable
似乎是为了这个目的而设计的。
由于问题中的原始代码实际上没有任何错误,我不得不将这一点授予sanford,因为他证明了这一点。
fun downloadData(): Completable {
...
return repository.downloadThing1()
.flatMapCompletable { downloadedThing1 ->
...
repository.downloadThing2()
}.andThen(repository.getThing2())
.flatMapCompletable { thing2 ->
...
repository.saveThing1(thing1)
if ("some condition") {
repository.downloadThing3()
.andThen(repository.downloadThing4())
.andThen(repository.downloadThing5())
.andThen(repository.downloadThing6())
} else {
Completable.complete()
}
}
.doOnComplete {
...
}
}