RxSwift

Rxswift (flatMap, flatMapFirst, flatMapLatest)

kkimin 2021. 6. 24. 10:29

해당 내용은 http://reactivex.io/documentation/operators.html#transforming 를 참고하면 되는데

요약하자면, Observable 항목 변환 라고 나와있다.

즉 위와 같은 내용으로 변환해준다고 할 수 있다. 그중에서

FlatMap

observable에서 발행한 아이템을 다른 Observable로 만들며, 해당 아이템을 발행하는 모습이라고 볼 수 있다.

 

flatMapFirst

flatMap과 마찬가지지만, 새로운 Observable은 동작이 다 끝날때까지 새로 발행된 아이템을 무시한다.

즉 여러개의 Observable이 return 될때 시작한 Observable이 아직 발행이 끝나지 않으면 그 후의 input은 무시되는 셈이다. 

 

flatMapLatest

flatMapFirst와 달리, 마지막 input이 중요하다고 보면 될것같다.

즉 input 1, 2, 가 차례로 들어왔을때 1로 인해 만들던 observable을 2가 들어오면 알아서 dispose하고 2로 인해 만드는 observable을 발행한다. 

 

예시

나는 아래와 같이 transform에서 observable -> observable을 return 시키고 사용하는 부분에서 subscribe할 수 있도록 했다.

	struct Input {
		let searchText: Driver<String> // search bar input Text
	}

	struct Output {
		var appList: Driver<[AppModel]>
        // input, output모두 확장
	}

func transform(_ input: Input, disposeBag: DisposeBag) -> Output {
		let searchList = input.searchText.flatMapLatest { text in // text는 마지막꺼만 중요
			return self.useCase.search(input: text)
				.asDriverOnErrorJustComplete()
		}
		return Output(appList: searchList)
	}
728x90