swift - RxSwift URLSession 请求已处理

标签 swift rx-swift

我正在学习使用 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<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)

关于swift - RxSwift URLSession 请求已处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56832692/

相关文章:

string - 将 .characters 应用于字符串时,我在这里看到什么返回?

ios - 如何创建一个发出键盘高度的 RxSwift Observable?

ios - RxSwift 基于变量构建 Observable

ios - RxSwift 崩溃 "Maybe delegate was already set in xib or storyboard and now it’ 被代码覆盖。”

ios - 使用 RxAlamofire 创建包含网络请求结果的 Observable

swift - RxSwift Driver 值的变异

ios - 在启用分页的情况下使两个 UICollectionView 同步滚动

Swift iOS14 DatePicker 文本对齐方式

ios - 使用 'case let x = y as NSString 发生内存泄漏

ios - %@ 的超链接在 iOS 上不起作用