참고 : https://github.com/ReactiveX/RxSwift/blob/main/Documentation/Traits.md
GitHub - ReactiveX/RxSwift: Reactive Programming in Swift
Reactive Programming in Swift. Contribute to ReactiveX/RxSwift development by creating an account on GitHub.
github.com
Single, Maybe, Completable은 Traits라고 합니다.
Traits는 이전에 공부한 Observable보다 좁은 범위의 Observable이라고 합니다.
사용하는 이유는 코드가독성을 높이는 데 있다고 해요.

Single
single은 Success이벤트와 error이벤트를 한번씩만 방출하는 Observable입니다.
Success는 기존 Observable의 Next이벤트와 Completed이벤트를 합친 것과 같습니다.
파일 다운로드, 데이터 로딩과 같은 값을 산출하는 비동기적 연산에 사용됩니다.
로딩이 성공되었는지 에러가 있는지 한가지 요소만을 방출하는 연산자를 래핑할때 유리합니다.
네트워크 환경에서 성공or실패를 다루는 경우에 많이 사용한다고해요.

Maybe
Maybe는 Single과 비슷하지만
Completed 되더라도 값을 방출하지 않습니다.
예를들어 유저가 사용하는 포토앨범 앱에서 사진을 일일이 저장할때는 completed이벤트를 방출하고 앨범을 삭제하거나 새로운 앨범을 생성한다면 success이벤트를 새로운 id값과 함께 방출시킬 수 있겠습니다.
문제가 있을 경우 error이벤트를 방출하게 될 것입니다.

Completable
completable은 completed와 error만 방출합니다.
위 두가지 single과 maybe와는 다르게 Observable을 asCompletable형식으로 바꿀 수 없다고 합니다.
Observable은 각 요소를 방출할 수 있지만 completed와 error만 방출하기 때문에 값 요소를 방출한 이상 바꿀 수없다고 해요.
Completable create를 하는 방법만 존재합니다.
completable은 어떠한 값도 방출하지 않습니다. 그럼 왜 필요할까요?
동기식 연산의 성공여부를 확인할 때 유용하다고 해요.
예를 들어 유저가 작업하는 동안 데이터가 자동으로 저장되는 기능을 만들고싶다고하면
백그라운드 큐에서 비동기적으로 작업하고 완료가되면 작은 노티를 띄우거나 오류가 생기면 Alert를 띄우겠죠. 이러한 상황엔 따로 값이 필요하지 않습니다.
이제 예제를 보면서 어떠한 방법으로 사용하는지 이해해보겠습니다.
single 예제부터 볼게요.


실행하면 just로 생성해준 이벤트가 출력되는 것이 보이고 바로disposed된 것을 확인할 수 있습니다.
에러도 발생시켜보겠습니다.
위 예제는 처음에 Single을 바로 생성하였지만 기존에 있던 Observable을 Single로 바꾸는 방법이 있습니다.
다만 이벤트가 조금 다르기때문에 이벤트 또한 바꾸어야 하기에 이부분을 주의해야할 것 같습니다.


git Readme에서 네트워크 통신을 하는 예제를 볼 수 있습니다.
Single 시퀀스를 만드는 함수 getRepo를 선언하였습니다.
통신이 실패한다면 failure이벤트를 방출, 오류가 발생하면 error이벤트를 방출, 성공시 success이벤트를 방출하는 것을 알 수 있습니다.
func getRepo(_ repo: String) -> Single<[String: Any]> {
return Single<[String: Any]>.create { single in
let task = URLSession.shared.dataTask(with: URL(string: "https://api.github.com/repos/\(repo)")!) { 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(DataError.cantParseJSON))
return
}
single(.success(result))
}
task.resume()
return Disposables.create { task.cancel() }
}
}
getRepo() 메소드를 단순히 호출하기만 하면 변화가 보이지 않을 것입니다.
구독을 하기전엔 정의에 불과하기 때문이죠.
.subscribe()구독을 해준뒤 이벤트를 switch문으로 구분합니다.
getRepo("ReactiveX/RxSwift")
.subscribe { event in
switch event {
case .success(let json):
print("JSON: ", json)
case .failure(let error):
print("Error: ", error)
}
}
.disposed(by: disposeBag)
getRepo("ReactiveX/RxSwift")
.subscribe(onSuccess: { json in
print("JSON: ", json)
},
onError: { error in
print("Error: ", error)
})
.disposed(by: disposeBag)
다음은 maybe 예제입니다.


maybe도 마찬가지로 asMaybe()로 변경할 수 있습니다.
에러를 발생시켜보겠습니다.


마지막으로
Completable
입니다.
위에서 언급한 것처럼 asMaybe같은 Observable을 변경할 방법은 없습니다.


'IOS' 카테고리의 다른 글
[iOS] RXswift (4) - Opeartor (0) | 2022.05.13 |
---|---|
[iOS] RXswift (3) - Subject (0) | 2022.05.13 |
iOS) RXswift란? - Observable (0) | 2022.05.12 |
iOS) UIImagePickerController (0) | 2022.05.11 |
iOS) 스토리보드 없이 인스타그램 레이아웃 그리기 & ActionSheet (0) | 2022.05.10 |
댓글