iOS/RxSwift

[RxSwift] Network 통신하기

728x90

이번에는 알바집 앱 회원 가입 api 로직을 rx로 변경해보았다!

📌 소스 코드

class RegisterDataManager{
    func postRegister(parameters: RegisterRequest) -> Observable<RegisterResponse> {
        return Observable.create { (observable) in
            let request = AF.request("\(Constant.BASE_URL)~~",
                                     method: .post, parameters: parameters,
                                     encoder: JSONParameterEncoder(),
                                     headers: nil)
            .validate(statusCode: 200..<300)
            .responseDecodable(of: RegisterResponse.self) { response in
                switch response.result {
                case .success(let response):
                    observable.onNext(response)
                    observable.onCompleted()
                case .failure(let error):
                    observable.onError(error)
                    observable.onCompleted()
                }
            }
            return Disposables.create { request.cancel() }
        }
    }
}

struct RegisterBasicViewModel {
    network.postRegister(parameters: setupRequest())
        .subscribe(
            onNext: { result in
                // 성공: 데이터 세팅 작업
        },
            onError: { error in
                // 실패: 에러 방출
        })
        .disposed(by: disposeBag)
}

📌 로직 설명

1) Observable.create 호출해 클로저를 전달

2) 기존 알바집 api 로직 삽입

  • 성공: onNext 이벤트 방출
  • 실패: onError 이벤트 방출
  • 성공+실패 둘다 onCompleted 이벤트 방출

3) Disposables.create 호출해 클로저를 전달

  • dispose되면 진행중이던 API 통신을 중단(request.cancel)

비동기 작업이 존재하지 않는 Observable create

  • 시퀀스가 취소되면 모든 작업이 중단되기에 빈 disposable를 반환해도됨

비동기 작업이 존재하는 Observable create

  • 시퀀스가 중단되어도 비동기 작업이 계속 실행됨
  • dispose 될때 태스크도 중단해줘야함❗️

 

[참고]

https://jeonyeohun.tistory.com/365

728x90

'iOS > RxSwift' 카테고리의 다른 글

[RxSwift] UITextField에 Rx 적용하기  (0) 2022.11.01
[RxSwift] ReactorKit 알아보기  (0) 2022.10.30
[RxSwift] RxCocoa란?  (0) 2022.10.23
[RxSwift] Combining Operator 알아보기  (0) 2022.10.23
[RxSwift] Transforming Operator 알아보기  (0) 2022.10.23