Alamofire + RxSwift

XELPINE·2023년 1월 10일
0

개발 이야기

목록 보기
1/3

RxSwift를 공부하면서, Alamofire와 RxSwift의 결합 개인 라이브러리를 개발하기로 마음먹었다.

RxAlamofire라는 좋은 라이브러리가 따로 존재하는 모양이지만,

개인적으로 개발한 라이브러리가 존재함과 동시에 기존 라이브러리와의 통합을 모색했다.
(아마 이렇게 하는 것이 나에게 있어서도 더 낫지 않을까..)

기존 라이브러리의 형태

class Requester<T:Decodable> : BaseRequester
{
	init(_ requestable:Requestable?, option:BaseRequestOption, complete:CompleteClosure? = nil, failed:FailedClosure? = nil)
}

기존에는 위와같은 형태로 개발에 사용해왔다.

Request에 필요한 정보를 가진 Requester class와, Request 관련 옵션을 포함한 BaseRequestOption, 그리고 성공과 실패에 사용할 Closure를 따로 마련했다.

이 Closure 형식을 제거하고 RxSwift를 도입해보기로 했다.




RxSwift를 도입해보자

먼저 init에서 바로 실행되는 구조에서 전달 function을 추가하였다.

func send () -> Observable<T>

타입은 Codable형태를 유지할 수 있도록 구성하였으며,

parse(data: data) { [weak self] (response:ResponseModel<T>?) in
                            guard let `self` = self else { return }
                            guard let response = response else {
                                
                                print ("===== REQUESTER parsing -> failed processed (1)")
                                
                                self.requestable?.removeRequester(self)
                                let error = NSError(domain: "PARSING ERROR", code: 1)
                                emitter.onError(error)
                                
                                return
                            }
                            
                            if response.isSuccess()
                            {
                                print ("===== REQUESTER parsing SUCCESS")
                                
                                emitter.onNext(response.resultData!)
                                emitter.onCompleted()
                            }

제네릭으로 받은 타입으로 변환이 가능한 지를 따져 parsing의 실행 유무까지 판단하여 최종적으로 emitter에 onNext, onError를 호출하도록 하였다.

아직은 Error를 따로 정의하지 않아 중구난방이다. 이 부분은 확실히 Error 타입을 개발하는 것이 좋을 듯 하다.

let disp = Disposables.create {
                
                self.requestable?.removeRequester(self)
                self.request?.cancel()
            }
            return disp

dispose될 때 Requester list에서 해당 인스턴스를 제거하고 또한 Alamofire역시 cancel 후 dispose되도록 했다.


수신부

_ = Requester(self, option: RequestOption(bodyDict: [:], showLoadingView: false))
                .send()
                .subscribe(
                onNext: { [weak self] (response:AdmSignInResponse?) in
                    print ("===== TestRxViewController req4 Requester onNext")
                },
                onError: { error in
                    print ("===== TestRxViewController req4 Requester onError : \(error)" )
                },
                onCompleted: {
                    print ("===== TestRxViewController req4 Requester onCompleted")
                },
                onDisposed: {
                    print ("===== TestRxViewController req4 Requester onDisposed")
                }

            )

동작은 잘 되는 듯 하다.

좀 더 다듬을 부분이 눈에 보이는데, 계속해서 공부해나가며 수정하고 새로운 프로젝트에 도입해보려고 한다.

profile
iOS / Android Programmer

0개의 댓글