【问题标题】:RxSwift URLSession request is disposedRxSwift URLSession 请求被处理
【发布时间】:2019-07-01 08:54:19
【问题描述】:

我正在学习使用 RxSwift,但我一直在使用这个简单的代码。我的意图是采用 APIRequest 类型,就这么简单:

public protocol APIRequest: Encodable {
    associatedtype Response: Decodable

    var path: String { get }
}

将它传递给 API 客户端并最终返回一个 T.Response 类型的 Observable,但是,我经常在控制台中看到 cancelled 状态:

2019-07-01 10:46:04.847: test api request -> subscribed
2019-07-01 10:46:04.855: test api request -> isDisposed

这是我的 APIClient 的代码:

func send<T: APIRequest>(_ request: T) -> Observable<T.Response> {
    guard let fullURL = endpoint(for: request) else {
        return Observable.error(APIError.invalidBaseURL)
    }

    return Observable<T.Response>.create { observer in
        let request = URLRequest(url: fullURL)
        let response = URLSession.shared.rx.response(request: request)
                              .debug("test api request")

        return response.subscribe(onNext: { response, data in
            if 200..<300 ~= response.statusCode {
                guard let responseItems = try? self.jsonDecoder.decode(T.Response.self, from: data) else {
                    return observer.onError(APIError.decodingFailed)
                }

                observer.onNext(responseItems)
                observer.onCompleted()
            }
        }, onError: { error in
            observer.onError(APIError.other(error))
        }, onCompleted: nil,
           onDisposed: nil)
    }
}

我一直在尝试将结果打印到控制台:

apiClient.send(countriesRequest)
            .subscribe(onNext: {
                print("Success", $0)
            }, onError: {
                print("Error: ", $0)
            }, onCompleted: {
                print("Completed!")
            })
            .disposed(by: disposeBag)

我做错了什么,为什么?

【问题讨论】:

  • func send&lt;T: APIRequest&gt;(_ request: T) -&gt; Observable&lt;T.Response&gt;的返回值怎么办?
  • @Andrew 添加了调用代码。
  • 我确实有那行,我抄错了,对不起。我确实有那条线。
  • 你是在某处取消这个disposeBag还是创建一个新的?
  • 此时,它是一个let disposeBag = DisposeBag() 作为 AppDelegate 中的属性,因为我想测试客户端。

标签: swift rx-swift


【解决方案1】:

我已尝试重新创建您的代码,但它似乎在我的设备上运行良好:

func send<T>(_ request: T) -> Observable<Data> {

    let request = URLRequest(url: URL(string: "sdf")!)

    return Observable.create { obs in
        URLSession.shared.rx.response(request: request).debug("r").subscribe(
            onNext: { response in
                return obs.onNext(response.data)
        },
            onError: {error in
                obs.onError(error)
        })
    }
}

我正在订阅它,它会产生错误

send("qwe").subscribe(
            onNext: { ev in
            print(ev)
        }, onError: { error in
            print(error)
        }).disposed(by: disposeBag)

【讨论】:

  • 你有一个response 属性并在观察者闭包中重新创建一个response 的任何特殊原因?
  • 哦不,只是一个错误
  • 我已经试用了您的代码,但我仍然看到在返回任何内容之前已处理订阅。我在我的日志中看到了这个:2019-07-01 11:39:44.850: test api request -&gt; subscribed2019-07-01 11:39:44.854: test api request -&gt; isDisposedDisposedcurl -X GET "https://restcountries.eu/rest/v2/all" -i -v Canceled (9115ms)
  • 在订阅方法中去掉.disposed(by: disposeBag)。似乎有问题。你在哪里调用这个请求?
  • 我认为您正在使用disposeBag) 因为您的请求只有在您重新创建或取消它时才能被处理。如果您在方法中从AppDelegate 获得disposeBag,它将仅在方法执行时存在,所以可能是您的情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-10
  • 2015-09-10
相关资源
最近更新 更多