jw
07/28/2019, 7:21 PMkevin.cianfarini
07/28/2019, 8:03 PMkevin.cianfarini
07/28/2019, 8:03 PM@ExperimentalCoroutinesApi
fun <T : Any> QueryDataSourceFactory<T>.asFlow(pageSize: Int): Flow<PagedList<T>> = flow {
var dataSource: DataSource<Int, T> = this@asFlow.create()
var invalidDataSource: DataSource<Int, T>? = null
emit(PagedList.Builder(dataSource, pageSize).build())
val channel = Channel<Unit>(Channel.CONFLATED)
val callback = DataSource.InvalidatedCallback {
invalidDataSource = dataSource
dataSource = this@asFlow.create()
channel.offer(Unit)
}
dataSource.addInvalidatedCallback(callback)
try {
channel.consumeEach {
invalidDataSource?.removeInvalidatedCallback(callback)
emit(PagedList.Builder(dataSource, pageSize).build())
dataSource.addInvalidatedCallback(callback)
}
} finally {
dataSource.removeInvalidatedCallback(callback)
}
}
alec
07/29/2019, 4:37 AM