koufa
12/09/2017, 9:01 PMloadProducts
method? I thought I did it before but I didnt worked as expected. sealed class ProductsAction
object LoadProducts: ProductsAction()
object FetchProducts: ProductsAction()
class ProductsViewModel(
private val productDataStore: ProductRepository,
private val coroutineContext: CoroutineContext)
: ViewModel(), JobHolder {
override val job: Job = Job()
private lateinit var channel: ReceiveChannel<List<Product>>
private val viewState = MutableLiveData<Result<ProductsUiModel>>()
fun action(action: ProductsAction) = actor.offer(action)
fun viewState(): LiveData<Result<ProductsUiModel>> = viewState
private val actor = actor<ProductsAction>(context = coroutineContext, parent = job) {
for (action in channel) {
when (action) {
is LoadProducts -> loadProducts()
is FetchProducts -> fetchProducts()
}
}
}
private suspend fun loadProducts(){
viewState.postValue(Loading())
channel = productDataStore.loadProducts(job, coroutineContext)
channel.consumeEach { products ->
val uiModel = ProductsUiModel(products)
viewState.postValue(Success(uiModel))
}
}
override fun onCleared() {
super.onCleared()
job.cancel()
}
}