Kotlin Coroutine Base UseCase - PullRequest
       25

Kotlin Coroutine Base UseCase

0 голосов
/ 24 апреля 2020

Я новичок в kotlin сопрограмме, я разработал базовый вариант использования, мне нужно знать, хорош этот дизайн или плох. Пример:

abstract class BaseUseCase<T, in Params> {

    private val foreGroundContext: CoroutineContext = Dispatchers.Main
    private val backgroundContext: CoroutineContext = Dispatchers.IO

    suspend fun execute(params: Params, block: Result<Block<T>>.() -> Unit) {

        coroutineScope {
            val response = ResultBlock<Block<T>>().apply { block() }

            try {
                withContext(foreGroundContext) {
                    response(true)
                }
                val result = withContext(backgroundContext) {
                    executeOnBackground(params)
                }
                withContext(foreGroundContext) {
                    response(result)
                }
            } catch (cancellationException: CancellationException) {
                withContext(foreGroundContext) {
                    response(Exception(cancellationException))
                }
            } catch (exception: Exception) {
                withContext(foreGroundContext) {
                    response(Block.Error<T>(error = Exception(exception)))
                }
            }
        }
    }

    protected abstract suspend fun executeOnBackground(params: Params): Block<T>
}

И из моей модели просмотра я буду звонить из модели представления

class MyViewModel : ViewModel(){

 fun testing() {
     viewModelScope.launch { 
       someUseCase.execute(Params) {
       start{}..complete{}..
     }       
   }
 }

Есть предложения по этому базовому сценарию использования?

...