在为我的网络层创建反应式扩展时,我注意到了一些模式,我想提取这些模式只是为了简化我未来实现的逻辑…所以我现在有两种方法,类似于这个方法:
static func create(params: [ String: AnyObject ]) -> Observable<Type> {
return Observable<Type>.create { observer -> Disposable in
let request = Alamofire.request(TypeAPI.Create(params: params).responseJSON { response in
switch response.result {
case .Success(let value):
guard response.response?.statusCode != 409 else {
observer.onError(RequestError.TypeAlreadyExists)
return
}
guard let dict = value as? [ String: AnyObject ] else {
observer.onError(RequestError.ParsingError)
return
}
guard let parsedType: Type = try? Unbox(dict) else {
observer.onError(RequestError.MappingError)
return
}
observer.onNext(parsedType)
case .Failure(let error):
observer.onError(RequestError.convert(error))
}
}
return AnonymousDisposable {
request.cancel()
}
}
}
例如,事情总是重复的。
我已经研究过
AnonymousDisposable
实现,它们的RxAlamofire
method基本上遵循了非常熟悉的模式,但是当我尝试将rx_request
实际用于当前的包装器时,我有点卡住了。到目前为止,我的结尾是:static func rx_create(params: [ String: AnyObject ]) -> Observable<Type> {
let manager: Manager = Manager.sharedInstance
manager.rx_request { manager -> Request in
return Alamofire.request(TypeAPI.Create(params: params))
}
}
但是
RxAlamofire
返回rx_request
并且我需要Observable<Request>
。如果我去添加Observable<Type>
我会再次用.flatMap
完成…有什么建议吗?正确的方法是什么?我至少在附近吗?还是我走错了方向?
最佳答案
有东西…至少我想我得到了一些东西。它起作用了,现在我对这个解决方案很满意,所以让我们跳到结论上来。
有.flatMap
的路径是正确的,但是为了避免额外的Observable.create
我必须深入到RxAlamofire
中,并从nicerx_responseJSON
方法中获益。
但后来我意识到我可以更深入地提取这个过程,所以我已经完成了所有请求包装类的通用方法,如下所示:
static func rx_request<T>(requestConvertible: URLRequestConvertible, completion: (Request) -> Observable<T> ) -> Observable<T> {
let manager: Manager = Manager.sharedInstance
return manager
.rx_request { manager -> Request in
return Alamofire.request(requestConvertible)
}
.flatMap { request -> Observable<T> in
return completion(request)
}
.shareReplay(1)
}
现在我可以使用如下方法:
static func rx_create(options: String) -> Observable<Type> {
return rx_request(TypesAPI.Create(options: options)) { request -> Observable<Type> in
request
.validate()
.rx_responseJSON()
.flatMap{ (request, json) -> Observable<Type> in
guard
let dict = json as? [ String: AnyObject ],
let parsedType: Type = try? Unbox(dict) else {
return Observable.error(RequestError.ParsingError)
}
return Observable.just(parsedType)
}
}
}
在我看来,它看起来有点干净