RxSwift URLSession 请求已处理

RxSwift URLSession request is disposed

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

public protocol APIRequest: Encodable {
    associatedtype Response: Decodable

    var path: String { get }
}

将它传递给 API 客户端,最后 return 一个 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

这是我的API客户代码:

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", [=13=])
            }, onError: {
                print("Error: ", [=13=])
            }, onCompleted: {
                print("Completed!")
            })
            .disposed(by: disposeBag)

我做错了什么,为什么?

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

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)