【问题标题】:Can I not call my method again before I get an answer?在我得到答案之前,我不能再次调用我的方法吗?
【发布时间】:2018-03-25 08:51:58
【问题描述】:

我在控制台中有此消息,因为 Api 方法被多次调用。

curl -X GET 
"https://newsapi.org/v2/top-headlines?apiKey=.............&pageSize=20&category=science&page=2" -i -v
Canceled (33ms)
2018-03-25 12:47:38.810618+0300 TestNewsApp[19773:2413537] Task <4B122FB1-1F0D-41FF-A102-BE2DE95BCBFC>.<42> finished with error - code: -999
2018-03-25 12:47:38.810779+0300 TestNewsApp[19773:2414036] Task <4B122FB1-1F0D-41FF-A102-BE2DE95BCBFC>.<42> HTTP load failed (error code: -999 [1:89])
curl -X GET 
"https://newsapi.org/v2/top-headlines?apiKey=.............&pageSize=20&category=science&page=2" -i -v
Canceled (34ms)
2018-03-25 12:47:38.844640+0300 TestNewsApp[19773:2413537] Task <9D6193D7-B757-4CB3-B812-452FE0B382BF>.<43> finished with error - code: -999
2018-03-25 12:47:38.844870+0300 TestNewsApp[19773:2413546] Task <9D6193D7-B757-4CB3-B812-452FE0B382BF>.<43> HTTP load failed (error code: -999 [1:89])
curl -X GET 
"https://newsapi.org/v2/top-headlines?apiKey=.............&pageSize=20&category=science&page=2" -i -v
Canceled (49ms)
2018-03-25 12:47:38.893744+0300 TestNewsApp[19773:2413579] Task <8A61A548-7F58-43CE-A829-57C8A6F952E5>.<44> finished with error - code: -999
2018-03-25 12:47:38.893937+0300 TestNewsApp[19773:2413546] Task <8A61A548-7F58-43CE-A829-57C8A6F952E5>.<44> HTTP load failed (error code: -999 [1:89])
curl -X GET 
"https://newsapi.org/v2/top-headlines?apiKey=.............&pageSize=20&category=science&page=2" -i -v
Success (1220ms): Status 200

这段代码有问题。

    scrollViewDidReachBottom
        .asObservable()
        .withLatestFrom(loadedPage.asObservable())
        .observeOn(MainScheduler.asyncInstance)
        .flatMapLatest { page in
            return NewsAPI.fetchNews(page: page + 1)
        }.subscribe( onNext: { [weak self]result in
            guard let strongSelf = self else { return }
            strongSelf.loadedPage.value = strongSelf.loadedPage.value + 1
            strongSelf.news.value = strongSelf.news.value + result
        })
        .disposed(by: disposeBag)

fetchNews(page: Int) -> Observable 是静态函数

我用这段代码修复了它,但我不确定它是正确的方法。

    scrollViewDidReachBottom
        .asObservable()
        .observeOn(MainScheduler.asyncInstance)
        .subscribe(onNext: { [weak self] _ in
            guard let strongSelf = self else { return }
            if !strongSelf.inCall {
                strongSelf.inCall = true
                NewsAPI.fetchNews(page: strongSelf.loadedPage.value + 1)
                    .observeOn(MainScheduler.asyncInstance)
                    .subscribe(onNext: { [weak self] news in
                        guard let strongSelf = self else { return }
                        strongSelf.news.value += news
                        strongSelf.loadedPage.value += 1
                        strongSelf.inCall = false
                    })
                    .disposed(by: strongSelf.disposeBag)
            }
        })
        .disposed(by: disposeBag)

【问题讨论】:

  • 隐藏图片中的apiKey

标签: ios swift pagination request rx-swift


【解决方案1】:

我用这段代码修复了它。

    scrollViewDidReachBottom
        .asObservable()
        .withLatestFrom(loadedPage.asObservable())
        .observeOn(MainScheduler.asyncInstance)
        .flatMapFirst { page in
            return NewsAPI.fetchNews(page: page + 1)
        }
        .subscribe( onNext: { [weak self]result in
            guard let strongSelf = self else { return }
            strongSelf.loadedPage.value += 1
            strongSelf.news.value = strongSelf.news.value + result
        })
        .disposed(by: disposeBag)

flatMapFirst 解决了我的问题。

【讨论】:

    【解决方案2】:

    你有错误:

    以错误结束 - 代码:-999

    根据这个answer,可能是因为你的网络管理员有问题。

    【讨论】:

    • 我使用 'URLSession.shared.rx.data(request: request)' 这是一个单例。 static func fetchNews(page: Int) -&gt; Observable&lt;[News]&gt; return URLSession.shared.rx.data(request: request)
    • 最后我总是成功。我认为这可能是因为多个请求。或者上面的代码有问题。因为单个请求不会返回“Canceled”。
    • 我可以修复我的代码,在之前的通话结束之前不要调用 'NewsAPI.fetchNews(page: Int)' 吗?
    • 嗨,@O.Shulzhenko。也许多个请求是问题所在。但也许.observeOn(MainScheduler.asyncInstance) 也是导致问题的原因?你试过删除它吗?
    猜你喜欢
    • 1970-01-01
    • 2018-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-10
    • 2019-05-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多