您正在使用 map 方法,该方法具有以下方法签名。
/**
Projects each element of an observable sequence into a new form.
- seealso: [map operator on reactivex.io](http://reactivex.io/documentation/operators/map.html)
- parameter transform: A transform function to apply to each source element.
- returns: An observable sequence whose elements are the result of invoking the transform function on each element of source.
*/
public func map<R>(_ transform: @escaping (Self.E) throws -> R) -> RxSwift.Observable<R>
如您所见,转换闭包只应该将元素更改为您希望 Observable 成为的类型。Obsevable
但是,在您的情况下,您似乎正在尝试返回<(HTTPURLResponse, Any)>
ie。Observable<(HTTPURLResponse, Any)>
从方法签名中可以看出,_request
但是您返回Observable<Observable<(HTTPURLResponse, Any)>>
,这就是您收到错误的原因。
看这个简单的例子,
let b = Observable.of(1, 2, 3, 4, 5).map { "\($0 + 1)" }
该示例转换元素并将每个元素加 1 并将其作为字符串返回。在这里,您正在转换每个元素。
此时的类型b
是Observable<String>
在你上面的例子中,你改变它的方式是你再次从地图返回 observable。
您的代码可以像这样可视化,
let b = Observable.of(1, 2, 3, 4, 5).map { Observable.just("\($0 + 1)) }
现在,b
不是Observable<String>
,而是Observable<Observable<String>>
。
这正是您的代码存在的问题。
这是你的_request
方法,
public func _request(_ method: Alamofire.HTTPMethod, url: URLConvertible, parameters: [String : Any]? , encoding: ParameterEncoding, headers: [String : String]?, isSecondTryAfterAuth: Bool = false) -> RxSwift.Observable<(HTTPURLResponse, Any)>
预期的返回类型相当Observable<(HTTPURLResponse, Any)>
但是你施展魔法然后回来,
Observable<Observable<(HTTPURLResponse, Any)>>
根据您的方法的返回类型,我希望这是您想要做的,
return RxAlamofire
.requestJSON(method, url,
parameters: parameters,
encoding: JSONEncoding.default,
headers: self.appDelegateInstance.refreshToken)
.map( { (response, json) -> (HTTPURLResponse, Any) in
return (response, json)
})
顺便说一句,最后的映射看起来是多余的,因为它只是返回输入,除非您打算将输入类型转换(response, json)
为其他类型。