안녕하세요🐶
빈지식 채우기의 비니🙋🏻♂️입니다.
오늘은 Traits에 대해 알아보도록 하겠습니다.
1. Traits 이란.
- UI 처리에 특화된 Observable
- 직관적이고 작성하기 쉬운 코드에 도움이 되는 Observable
- .asObservable 사용시 다시 기본 Observable로 돌아갈 수 있음.
2. Single
- 1개의 요소를 포함하는 Observable
- Success(value) 이벤트 또는 Error 이벤트를 한번만 방출합니다.
- Success = Next + Completed 로 볼 수 있습니다.
- 즉 Success 가 발생하면 해당 single 은 종료됩니다.
- 즉 하나의 원소나 에러를 방출하도록 보장된 Observable 의 변형입니다.
Single<Int>.create { single in
single(.success(219)) // 방출 O
single(.success(1994)) // 방출 X
return Disposables.create()
}.subscribe(
onSuccess: {
print("Success : \($0)")
},
onFailure: {
print("Error : \($0.localizedDescription)")
},
onDisposed: {
print("Disposed")
}
).disposed(by: disposeBag)
- Int 219 와 1994, 2개의 값을 전달
- Single 이므로 219 만 방출 후 종료
2-1. asSingle()
- 기본 Observable 을 Single 로 변환이 가능하다.
Observable<Int>.create { observer in
observer.onNext(219)
observer.onCompleted()
return Disposables.create()
}
.asSingle()
.subscribe(
onSuccess: {
print("Success : \($0)")
},
onFailure: {
print("Error : \($0.localizedDescription)")
},
onDisposed: {
print("Disposed")
}
).disposed(by: disposeBag)
🚨주의 사항🚨
Single 이벤트인 Success 는 Next 와 Completed 성격을 다 포함하고 있기 때문에,
아래와 같이 Next 이벤트가 들어오지 않으면 에러를 발생한다.
Observable<Int>.create { observer in
// observer.onNext(219)
observer.onCompleted()
return Disposables.create()
}
.asSingle()
.subscribe(
onSuccess: {
print("Success : \($0)")
},
onFailure: {
print("Error : \($0.localizedDescription)")
},
onDisposed: {
print("Disposed")
}
).disposed(by: disposeBag)
3. Maybe
- 0개 또는 1개의 요소를 포함하는 Observable
- Maybe 는 Completed가 발생하였을 때 Next 값을 전달하지 않아도 에러가 발생하지 않습니다.
- Success(value), Completed, Error 이벤트 3가지를 방출할 수 있습니다.
Maybe<Int>.create { maybe in
maybe(.success(219))
//OR
maybe(.completed)
//OR
maybe(.error(error))
return Disposables.create()
}.subscribe(
onSuccess: {
print("Success : \($0)")
},
onCompleted: {
print("Completed")
},
onDisposed: {
print("Disposed")
}
).disposed(by: disposeBag)
4. Completable
- Completed 이벤트 또는 error 이벤트를 방출합니다.
- 어느 요소도 방출하지 않고 에러나 완료만 가능한 Observable 변형입니다.
- Single, Maybe 와 다르게 Observable을 Completable 로 바꿀 수 없습니다.
Completable.create { completable in
completable(.completed)
//OR
completable(.error(MyError.error))
return Disposables.create()
}.subscribe(
onCompleted: {
print("Completed")
},
onError: {
print("Error : \($0.localizedDescription)")
},
onDisposed: {
print("Disposed")
}
).disposed(by: disposeBag)
5. 정리
Single | Maybe | Completable | |
특징 | 1. 1개의 요소를 포함 2. Success or Error 한번 방출 3. Success = Next + Completed |
1. 0개 또는 1개 요소 포함 2. Success, Completed, Error 3가지를 방출 가능 3. 아무런 값을 방출하지 않아도 Completed 가능 |
1. Completed, Error 2가지를 방출 가능 2. 어느 요소도 방출하지 않고 Completed 와 Error 만 가능 3. Observable 을 Completable로 변경 불가능 |
사용 예시 | 파일 저장, 파일 다운로드 등등 | 데이터 저장 성공 여부 확인 |
이상으로 Traits 에 대해 알아보았습니다.
전체 소스는 아래에 있습니다.
import Foundation
import RxSwift
import RxCocoa
class Traits {
let disposeBag = DisposeBag()
func singleTest() {
print("----------------------------------------------------------")
Single<Int>.create { single in
single(.success(219))
single(.success(1994))
return Disposables.create()
}.subscribe(
onSuccess: {
print("Success : \($0)")
},
onFailure: {
print("Error : \($0.localizedDescription)")
},
onDisposed: {
print("Disposed")
}
).disposed(by: disposeBag)
print("----------------------------------------------------------")
Observable<Int>.create { observer in
// observer.onNext(219)
observer.onCompleted()
return Disposables.create()
}
.asSingle()
.subscribe(
onSuccess: {
print("Success : \($0)")
},
onFailure: {
print("Error : \($0.localizedDescription)")
},
onDisposed: {
print("Disposed")
}
).disposed(by: disposeBag)
print("----------------------------------------------------------")
}
func maybetest() {
print("----------------------------------------------------------")
Maybe<Int>.create { maybe in
maybe(.success(219))
//OR
// maybe(.completed)
//OR
// maybe(.error(error))
return Disposables.create()
}.subscribe(
onSuccess: {
print("Success : \($0)")
},
onCompleted: {
print("Completed")
},
onDisposed: {
print("Disposed")
}
).disposed(by: disposeBag)
print("----------------------------------------------------------")
}
enum myError: Error {
case error
}
func completableTest() {
print("----------------------------------------------------------")
Completable.create { completable in
completable(.completed)
//OR
completable(.error(MyError.error))
return Disposables.create()
}.subscribe(
onCompleted: {
print("Completed")
},
onError: {
print("Error : \($0.localizedDescription)")
},
onDisposed: {
print("Disposed")
}
).disposed(by: disposeBag)
print("----------------------------------------------------------")
}
}
다음 포스팅은 Share에 대해 알아보도록 하겠습니다.
감사합니다~~
참고
'iOS 🖥️ > RxSwift' 카테고리의 다른 글
[RxSwift] Share(replay:) (0) | 2024.01.25 |
---|---|
[RxSwift] Debounce, Throttle (0) | 2024.01.17 |
[RxCocoa] Driver (0) | 2024.01.17 |
[RxCocoa] Relay (2) | 2024.01.16 |
[ RXSwift ] Subject (2) | 2024.01.15 |