iOS/RxSwift

[RxSwift] PrimitiveSequenceType

최지철 2024. 9. 30. 14:07
728x90
반응형

PrimitiveSequenceType이란?

PrimitiveSequenceType은 RxSwift에서 제공하는 프로토콜로, 기본적인 시퀀스 타입을 정의합니다.
단일한 요소 또는 이벤트를 처리하는 시퀀스로, Single, Maybe, Completable 세 가지 타입이 있습니다. 

PrimitiveSequenceType의 종류와 사용 방법

1. Single

Single은 하나의 요소 또는 에러를 방출하고 종료되는 시퀀스입니다. 주로 네트워크 요청이나 데이터베이스 조회 등 한 번의 결과를 필요로 하는 작업에 사용됩니다.

  • 성공 이벤트: 단일 요소를 방출하고 완료
  • 실패 이벤트: 에러 방출

예제 코드:

func fetchUserProfile(userID: String) -> Single<UserProfile> {
    return Single.create { single in
        // 네트워크 요청 시뮬레이션
        let success = true
        if success {
            let profile = UserProfile(id: userID, name: "홍길동")
            single(.success(profile))
        } else {
            single(.failure(NetworkError.notFound))
        }
        return Disposables.create()
    }
}

사용 방법:

fetchUserProfile(userID: "1234")
    .subscribe(
        onSuccess: { profile in
            print("사용자 프로필: \(profile)")
        },
        onFailure: { error in
            print("에러 발생: \(error)")
        }
    )
    .disposed(by: disposeBag)
 

2. Completable

Completable은 요소를 방출하지 않고 완료 또는 에러 이벤트만을 방출하는 시퀀스입니다. 데이터 저장이나 로그아웃 등 결과 값이 필요 없는 작업에 적합합니다.

  • 완료 이벤트: 작업 완료를 알림
  • 실패 이벤트: 에러 방출

예제 코드:

func saveUserProfile(_ profile: UserProfile) -> Completable {
    return Completable.create { completable in
        // 데이터 저장 시뮬레이션
        let success = true
        if success {
            completable(.completed)
        } else {
            completable(.error(DatabaseError.saveFailed))
        }
        return Disposables.create()
    }
}

사용 방법:

saveUserProfile(profile)
    .subscribe(
        onCompleted: {
            print("프로필 저장 완료")
        },
        onError: { error in
            print("저장 에러: \(error)")
        }
    )
    .disposed(by: disposeBag)

3. Maybe

Maybe는 요소를 방출할 수도 있고 안 할 수도 있으며, 완료 또는 에러 이벤트를 방출할 수 있는 시퀀스입니다. 데이터가 존재할 수도 있고 없을 수도 있는 상황에 유용합니다.

  • 성공 이벤트: 단일 요소 방출 후 완료
  • 완료 이벤트: 요소 없이 완료
  • 실패 이벤트: 에러 방출

예제 코드:

func fetchCachedData(forKey key: String) -> Maybe<Data> {
    return Maybe.create { maybe in
        // 캐시 데이터 조회 시뮬레이션
        let cachedData: Data? = nil
        if let data = cachedData {
            maybe(.success(data))
        } else {
            maybe(.completed)
        }
        return Disposables.create()
    }
}

사용 방법:

fetchCachedData(forKey: "user_profile")
    .subscribe(
        onSuccess: { data in
            print("캐시된 데이터: \(data)")
        },
        onCompleted: {
            print("캐시 데이터 없음")
        },
        onError: { error in
            print("에러 발생: \(error)")
        }
    )
    .disposed(by: disposeBag)

PrimitiveSequenceType을 사용하는 이유

  1. 명확한 의도 표현: 각 타입은 특정한 상황에 맞게 설계되어 있어, 코드의 의도를 더 명확하게 표현할 수 있습니다.
  2. 코드 가독성 향상: 불필요한 처리나 옵저버 설정을 최소화하여 코드가 더욱 간결해집니다.
  3. 에러 처리 간소화: 각 타입은 성공과 실패 이벤트를 명확하게 구분하므로 에러 처리가 쉬워집니다.
728x90
반응형