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
반응형