RxSwift URLSession запрос находится - PullRequest
2 голосов
/ 01 июля 2019

Я учусь использовать RxSwift и застрял, используя этот простой код.Я собираюсь взять тип APIRequest, такой простой:

public protocol APIRequest: Encodable {
    associatedtype Response: Decodable

    var path: String { get }
}

Передать его клиенту API и, наконец, вернуть Observable типа T.Response, однако я постоянно вижу 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)

Что я делаю не так и почему?

1 Ответ

2 голосов
/ 01 июля 2019

Я попытался воссоздать ваш код, и на моем устройстве он работает нормально:

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)
...