链接请求并使用RxSwift返回两个结果

我有一个ContentService要求发表文章。该文章响应包含一个authorId属性。

我有一个ProfileService,允许我通过userId请求用户个人资料。

我正在尝试从ContentService请求一篇文章,使用ProfileService属性将请求链接到完成authorId的请求上,然后我想返回一个{{ 1}},其中包含文章和个人资料信息。

我的ContentArticleViewModel看起来像这样-

ArticleInteractor

很简单final class ArticleInteractor: ArticleInteractorInputProtocol { let fetchArticleTrigger = PublishSubject<String>() private lazy var disposeBag = DisposeBag() weak var output: ArticleInteractorOutputProtocol? { didSet { configureSubscriptions() } } private func configureSubscriptions() { guard let output = output else { return } fetchArticleTrigger .bind(to: dependencies.contentSvc.fetchContentByIdTrigger) .disposed(by: disposeBag) dependencies.contentSvc.fetchContentByIdResponse .bind(to: output.fetchArticleResponse) .disposed(by: disposeBag) } } 开始一个请求,然后我在fetchArticleTriggerbind并接收响应。

我的dependencies.contentSvc.fetchContentByIdResponse上的方法是-

ContentService

我的 // MARK:- FetchContentById // @params: id - String // return: PublishSubject<ContentArticle> fetchContentByIdTrigger .flatMapLatest { [unowned self] in self.client.request(.getcontentById(id: $0)) } .map { (resp: Result<ContentArticle>) in guard case .success(let props) = resp else { return ContentArticle() } return props } .bind(to: fetchContentByIdResponse) .disposed(by: disposeBag) 上有一个非常相似的设置-

ProfileService

我想我将为该文章创建一个模型,例如-

    // MARK:- FetchUserProfileById
    // @params: id - String
    // return: PublishSubject<User>
        fetchUserProfileByIdTrigger
            .flatMapLatest { [unowned self] in self.client.request(.getProfileByUserId(id: $0)) }
            .map { (resp: Result<User>) in
                guard case .success(let props) = resp else { return User() }
                return props
        }
        .bind(to: fetchUserProfileByIdResponse)
        .disposed(by: disposeBag)

我正在struct ContentArticleViewModel { var post: ContentArticle var user: User } -

中想象类似这样的伪代码
ArticleInteractor

但是我完全迷失了如何最好地处理这个问题。我看过许多有关链接请求的文章,但都在努力成功地应用任何内容。

编辑

我目前有工作-

    dependencies.contentSvc.fetchContentByIdResponse
        .flatMapLatest { article in
             /* fetch profile using `article.authorId */
        }.map { article,profile in
            return ContentArticleViewModel(post: article,user: profile)
        }
        .bind(to: output.fetchArticleResponse)
        .disposed(by: disposeBag)

但是我不确定这是正确的。

nicklong465 回答:链接请求并使用RxSwift返回两个结果

我不确定为什么这么少的工作有这么多代码。下面是一个示例,该示例可以执行您所描述的事情(下载文章,下载作者个人资料并同时发送两者),并且代码少得多,甚至 it 比我通常使用的代码还要多。

protocol ContentService {
    func requestArticle(id: String) -> Observable<Article>
    func requestProfile(id: String) -> Observable<User>
}

class Example {
    let service: ContentService
    init(service: ContentService) {
        self.service = service
    }

    func bind(trigger: Observable<String>) -> Observable<(Article,User)> {
        let service = self.service
        return trigger
            .flatMapLatest { service.requestArticle(id: $0) }
            .flatMapLatest {
                Observable.combineLatest(Observable.just($0),service.requestProfile(id: $0.authorId))
            }
    }
}

或者也许您想在等待作者个人资料下载时显示文章。在这种情况下,如下所示:

func bind(trigger: Observable<String>) -> (article: Observable<Article>,author: Observable<User>) {
    let service = self.service
    let article = trigger
        .flatMapLatest { service.requestArticle(id: $0) }
        .share(replay: 1)

    let author = article
        .flatMapLatest {
            service.requestProfile(id: $0.authorId)
    }

    return (article,author)
}
本文链接:https://www.f2er.com/3164770.html

大家都在问