2016-08-17 2 views
3

내 네트워킹 레이어에 대한 반응식 확장 기능을 만드는 동안 패턴을 발견했습니다. 향후 구현을 위해 내 논리를 간단하게 추출하고 싶습니다. 방법 중 몇이 하나에 비슷한 : 네트워킹 주위에 반응식 래퍼 만들기

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으로 다시 마무리 할 것입니다 ...

어떤 제안이 올바른 접근법입니까? 내가 어딘가 근처에 있니? 아니면 완전히 잘못된 방향으로 가고 있습니까?

답변

0

내가 뭔가를 얻었습니다. 그것은 작동하며, 지금은이 솔루션에 만족합니다. 결론으로 ​​넘어 갑니 다. .flatMap

경로가 올바른했지만, 추가 Observable.create을 피하기 위해 나는이 좋은 rx_responseJSON 방법

에서 RxAlamofire 혜택에 깊은 가야했다 그러나 I'v은 심지어 더 나아가이 과정을 추출 할 수 있음을 깨달았

:

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

내 의견으로는 조금 더 깨끗해 보입니다. ☺️