Rx-Swift Clean architecture

clean-architecture, ios, rx-swift, swift

Solution

Hi I'm using rxswift with clean architecture recently project

In my case, I use them in Profile scene especially looks like instagram

use case of profile scene

- user should refresh profile scene

- user should chance photo's category

- user should load more photo's like pagination

problem is, user can change post's category rapidly then

last fetched post's should be different to selected category :(

all event cause event asyncronousely

so I use rxswift

In Interactor has profileWorker(to fetch profile and category's post count), postWorke(to fetch posts)

and create three rxswift `PublishSubject` like - rxCategory - rxProfile - rxPosts

Step is like below

`Interactor` subscribe `rxCategory`

`ViewController` request category change to `Interactor`

`Interactor` cause event `rxCategory.on(Event<Category>.next(category))`

`Interactor` using rxswift's flatMapLatest request posts with selected Category to postsWorker

rxCategory.asObservable().flatMapLatest{ (category) -> Observable<[Posts]> in
            return self.postsWorker.rxFetchPosts(requestModel, category: category)
        }.subscribe { (event) in
                if let posts = event.element {
                    self.updatePosts(posts)
                }
        }
 }

`PostsWorker` request `Observable<[Posts]>` to PostService (request to server using `Alamofire` and `SwiftyJSON`)

then `PostService` return `Observable<Posts>` then worker return to interactor

`Interactor` subscribe `PostsWorker`'s Observable and update posts , this cause `rxPosts`s event accur

`Interactor` subscribe `rxProfile` and `rxPosts` using combineLatest

and request presenting combined response to `Presentor`

Observable.combineLatest(rxProfile, rxPosts) { (e1, e2) -> ProfileResponse in

            return ProfileResponse(profile: e1, posts: e2)

            }.subscribe { (event: Event<ProfileResponse>) in
                self.output.presentProfile(event.element!)
        }
 }

this is my example using rxswift + clean swift architecture

in this situation, if user tap `FOOD` category and worker fetch many posts

and user tap `PLACE` category and fetch small posts then sometimes

although user tap people category. food posts fetched after people's posts

so I use rxswift to match correctly to selected category using flatMapLatest ReativeX - FlatMapLatest

this can fetch and present to `Presentor` latest category's posts

rxswift known useful in `MVVM` architecture.

but I think it's up to you how can use them

thank you for reading :)

Problem

I want to design my swift app using clean architecture. I have read the link below on clean architecture for swift http://clean-swift.com/blog/ I have used these templates to create the app. I wanted to ask if this is the best architecture to use as I want to code using Rx-Swift. Also I would appreciate if someone could point out a few working examples for clean architecture with reactive swift. Is using Uncle Bob’s Clean Architecture for swift(http://clean-swift.com/blog/) a best practise for RxSwift or should I go with MVVM architecture Any help will be appreciated. Thank you.

Original source