RXSwift 为什么加载变量 return 错误值?

RXSwift why loading variable return wrong value?

这是我的视图模型:

    let loadMoreTrigger = PublishSubject<Void>()
    let refreshTrigger = PublishSubject<Void>()
    let loading = BehaviorRelay<Bool>(value: false)
    let stories = BehaviorRelay<[Story]>(value: [])
    var offset = 0
    let error = PublishSubject<String>()
    let selectedFeedType: BehaviorRelay<FeedType> = BehaviorRelay(value: .best)

   override init() {
    super.init()
    let refreshRequest = loading.asObservable().sample(refreshTrigger).flatMap { loading -> Observable<[Story]> in
        if loading {
            return Observable.empty()
        } else {
            self.offset = 0
            return self.fetchStories(type: self.selectedFeedType.value, offset: self.offset)
        }
    }
    let loadMoreRequest = loading.asObservable().sample(loadMoreTrigger).flatMap { loading -> Observable<[Story]> in
        if loading {
            return Observable.empty()
        } else {
            self.offset += 10
            return self.fetchStories(type: self.selectedFeedType.value, offset: self.offset)
        }
    }
    let request = Observable.merge(refreshRequest, loadMoreRequest).share(replay: 1)
    
    let response = request.flatMap { (stories) -> Observable<[Story]> in
        request.do(onError: { error in
            self.error.onNext(error.localizedDescription)
        }).catchError { (error) -> Observable<[Story]> in
            Observable.empty()
        }
    }.share(replay: 1)
    
    Observable.combineLatest(request, response, stories.asObservable()) { request, response, stories in
        return self.offset == 0 ? response : stories + response
    }.sample(response).bind(to: stories).disposed(by: disposeBag)
    
    Observable.merge(request.map{_ in true}, response.map{_ in false}, error.map{_ in false}).bind(to: loading).disposed(by: disposeBag)
}

然后当我检查加载观察器时,我得到的是 false -> true,而不是 true -> false。我只是不明白为什么会这样。

    loading.subscribe {
        print([=12=])
    }.disposed(by: disposeBag)

在我的 viewController 中,我使用 rx.sentMessage

在 vi​​ewWillAppear 上调用 refreshTrigger

这里是 getFeed 函数:

func getFeed(type: FeedType, offset: Int) -> Observable<[Story]> {
    return provider.rx.request(.getFeed(type: type, offset: offset)).asObservable().flatMap { (response) -> Observable<[Story]> in
        do {
            let feedResponse = try self.jsonDecoder.decode(BaseAPIResponse<[Story]>.self, from: response.data)
            guard let stories = feedResponse.data else { return .error(APIError.requestFailed)}
            return .just(stories)
        } catch {
            return .error(error)
        }
    }.catchError { (error) -> Observable<[Story]> in
        return .error(error)
    }
}

您的 requestresponse observables 正在同时发出值。哪个先出现在您的订阅中是未定义的。

具体来说,request 在获取请求完成之前不会发出值。试试这个:

Observable.merge(
    loadMoreTrigger.map { true },
    refreshTrigger.map { true },
    response.map { _ in false },
    error.map { _ in false }
)
.bind(to: loading)
.disposed(by: disposeBag)

您的代码中还有很多其他问题,但以上内容回答了这个具体问题。