在爲我的網絡層創建反應式擴展時,我注意到了一些模式,我只想簡單介紹一下我的邏輯以便將來實現......所以我現在所擁有的是幾個方法類同這一個:在網絡周圍創建反應包裝
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
的實現,它們的rx_request
method基本上遵循相當熟悉的模式,但是當我嘗試實際使用RxAlamofire
和我的當前包裝時,我有點卡住了。到目前爲止,我喜歡的東西結束:
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))
}
}
但rx_request
回報Observable<Request>
,我需要Observable<Type>
。如果我去並添加.flatMap
比我完成AnonymousDisposable
再次...
任何建議什麼是正確的方法?我至少在什麼地方?或者我完全錯誤的方向?