RxSwift

[RxSwift] Traits Part 1.

thoonk: 2024. 3. 8. 14:07
반응형

RxSwift Trait 관한 내용을 기록합니다.

Traits

  • Observable 시퀀스의 특성을 정의하는 Wrapper 구조체
  • 직관적이고 작성하기 쉬운 코드를 작성하는데 도움을 줌
  • .asObservable() 호출을 통해 Observable 시퀀스로 변환될 수 있음.

Traits 사용 이점

  • 코드 간결성 및 가독성 향상
  • 특정 상황에 맞는 Observable 시퀀스 생성 및 사용 용이
  • 유지 관리 및 테스트 용이성 향상

Single

  • 단일 element 또는 error를 방출
  • API 호출 결과 값 또는 데이터베이스에서 단일 레코드를 가져올 때 유용
  • .asSingle() 호출을 통해 Single 로 변환 가능
  • API 결과 예시
func fetchAllItems() -> Single<[Item]> {
    return Single.create { [weak self] single in
        let task = URLSession.shared.dataTask(wih: URL(string: "<https://api.com>")!) { data, _, error in
            if let error = error {
                single(.failure(error))
                return
            }
            
            guard let data = data,
                  let json = try? JSONSerialization.jsonObject(with: data, options: .mutableLeaves),
                  let result = json as? [String: Any] else {
                single(.failure(APIError.parseJson))
                return
            }
            
            single(.success(result["items"]))
        }
        task.resume()

        return Disposables.create { task.cancel() }
    }
}

fetchAllItems()
		.subscribe(onSuccess: { items in 
				print("Success")
		}, onError: { error in
				print("Error")
		}, onCompleted: {
				print("Completed")
		})
		.disposed(by: disposeBag)

Completable

  • 작업 완료를 나타내는 Obsevable 시퀀스
  • 어느 element 도 방출하지 않고 .completed 또는 .error 만 방출
  • API 호출 결과가 성공 또는 실패 여부만 중요할 때, 데이터베이스에 데이터를 저장할 때 유용
  • CoreData 데이터 추가 예시
func addItem(_ item: Item) -> Completable {
    return Completable.create {
        let entity = Item(context: self.container.viewContext)
        entity.id = String(user.id)
        entity.name = user.name
        do {
            try self.saveContext()
        } catch {
            $0(.error(CoreDataError.addingItem))
        }
        $0(.completed)
        
        return Disposables.create()
    }
}

Maybe

  • 값을 방출하거나 아무것도 방출하지 않을 수 있는 Observable 시퀀스 (success(value), completed, error)
  • Single 과 유사하지만 아무런 값을 방출하지 않고 Complete되어도 오류 발생하지 않음.
  • 데이터가 존재할 수 도 있고 없을 수 도 있거나 API 호출 결과가 null 일 수 있을 때 유용
  • .asMaybe() 호출을 통해 Maybe 로 변환 가능
  • API 결과 예시
func fetchItem() -> Maybe<Item> {
	return dataSource.fetchItem()
		.map { result -> Maybe<String> in 
			if result.success {
				return Maybe.just(result.data)
			} else {
				return Maybe.empty() 
			}
		}
}

 

부족한 점 피드백해주시면 감사합니다 :)

Ref.

https://github.com/ReactiveX/RxSwift/blob/main/Documentation/Traits.md

반응형