Untitled

 avatar
unknown
kotlin
5 years ago
2.5 kB
8
Indexable
val actions = PublishSubject.create<String>() // типа экшены редукса

// методы репозитория
fun loadProfile() = Observable.just(1) // грузим профиль из сети
fun loadPosts() = Observable.just(1) // грузим посты из сети
fun getProfileFlow() = Observable.just(1) // подписываемся на профиль из бд
fun getPostFlow() = Observable.just(1) // подписываемся на посты из бд
fun insertProfile(profile: Int) = Completable.complete() // вставляем профиль в бд
fun insertPosts(posts: Int) = Completable.complete() // вставляем посты в бд

sealed class Action {
    object InitAction : Action()
    data class FailedLoadProfile(val e: Throwable) : Action()
    data class FailedLoadPosts(val e: Throwable) : Action()

    data class OnPostsReceived(val posts: Int) : Action()
    data class OnProfileReceived(val profile: Int) : Action()
    data class OnProfileReceivedFailed(val e: Throwable) : Action()
    data class OnPostsReceivedFailed(val e: Throwable) : Action()
}


fun handleInitEff(): Observable<Action> = actions.ofType(Action.InitAction::class.java)
    .switchMap {
        Observable.merge(
            listOf(
                loadProfile()
                    .flatMap { profile -> insertProfile(profile).toObservable<Action>() }
                    .onErrorReturn { e -> Action.FailedLoadProfile(e) }
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread()),
                loadPosts()
                    .flatMap { posts -> insertPosts(posts).toObservable<Action>() }
                    .onErrorReturn { e -> Action.FailedLoadPosts(e) }
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread()),
                getProfileFlow()
                    .map<Action> { profile -> Action.OnProfileReceived(profile) }
                    .onErrorReturn { e -> Action.OnProfileReceivedFailed(e) }
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread()),
                getPostFlow()
                    .map<Action> { posts -> Action.OnPostsReceived(posts) }
                    .onErrorReturn { e -> Action.OnPostsReceivedFailed(e) }
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
            )
        )
    }
Editor is loading...