You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Swift 표준 라이브러리의 map과 동일, 원하는 타입 / 계산된 결과로 새로운 Obsservable 방출
letdisposeBag=DisposeBag()letformatter=NumberFormatter()
formatter.numberStyle =.spellOut
Observable<NSNumber>.of(123,4,56).map{
// formatter를 통한 NSNumber 타입을 String 타입 스펠링으로 변환
formatter.string(from: $0)??""}.subscribe(onNext:{print($0)
// one hundred twenty-three
// four
// fifty-six
}).disposed(by: disposeBag)
inner observable이라 함은 Observable안에 있는 Observable을 말한다.
Student는 BehaviorSubject 타입의 score라는 프로퍼티를 갖는 struct다. 이를 Observable로 활용하게 되면 score는 inner observable이 된다
RxSwift는 flatMap 연산자 내에 몇 가지 연산자를 가지고 있다. 이들은 observable 내부로 들어가서 inner observable 속성들과 작업을 가능하게 한다
1. flatMap
Observable시퀀스의 element당 한 개의 새로운 Observable 시퀀스를 생성한다. 이렇게 생성된 여러개의 새로운 시퀀스를 하나의 시퀀스로 합쳐준다.
01엘리먼트가 flatMap을 만나 새로운 시퀀스가 생겼다. 이 시퀀스는 01엘리먼트의 value에 대한 시퀀스다.
새로 생성된 시퀀스에 10 이벤트가 발생했고, 최종 시퀀스(제일 하단 시퀀스)로 전달되었다.
즉, 01엘리먼트의 value에 변동이 있으면, 이 시퀀스에 이벤트가 발생하는 것이다.
02엘리먼트가 flatMap을 만나 새로운 시퀀스가 생겼다. 마찬가지로, 이 시퀀스는 02엘리먼트의 value에 대한 시퀀스다.
새로 생성된 시퀀스에 20 이벤트가 발생했고, 최종 시퀀스로 전달되었다.
02엘리먼트의 value에 변동이 있으면, 이 시퀀스에 이벤트가 발생한다. 02도 마찬가지다.
01엘리먼트의 value에 변동이 생겼다. 1에서 4로 바뀐 것이다. (1에서 4로 바뀌는것이 그림에는 표현되지 않았습니다. 그림이 지저분해지니깐)
flatMap이 생성한 시퀀스 중 01엘리먼트에 해당하는 시퀀스에 40이라는 이벤트가 발생하여, 최종 시퀀스로 전달되었다.
02엘리먼트의 value에 변동이 생겼다. 2에서 5로 바뀐 것이다.
그래서, flatMap이 생성한 02엘리먼트에 해당하는 시퀀스에 50이라는 이벤트가 발생했고, 최종 시퀀스로 전달되었다.
정리해보자면, flatMap은 한 시퀀스의 element를 전달받아 이를 변형한 새로운 시퀀스를 만들고, (Element하나당 Sequence하나를 생성) 이 시퀀스에서 발생하는 모든 이벤트를 최종 시퀀스로 전달하는 것이다.
flatMap은 observable의 element( inner observable )의 변화를 계속 관찰
2. flapMapLatest
flatMapLatest는 두 개의 Operator인 flatMap과 switchLatest가 합쳐진 역할을 한다
switchLatest 또한 Observable in observable을 다루는데, 가장 마지막으로 추가된 시퀀스의 inner observable만 넘겨준다.
즉, flatMapLatest는 가장 마지막으로 추가된 시퀀스의 inner observable 이벤트만 subscribe하게 된다.
flatMapLatest가 flatMap과 다른 점은, 자동적으로 이전 observable을 구독해지한다는 것이다.
flatMap과 마찬가지로, 01엘리먼트의 value에 해당하는 시퀀스가 생긴다. 01엘리먼트의 최초 value인 1에 10을 곱하여 최종 시퀀스로 전달된다.
마찬가지로, 02엘리먼트의 value에 해당하는 시퀀스가 생긴다. 02엘리먼트의 최초 value인 2에 10을 곱한 값이 최종 시퀀스로 전달된다.
그 뒤에, 01엘리먼트의 value가 3으로 바뀌었나보다. 30이 전달된걸 보니...하지만 최종 시퀀스에는 전달되지 않는다. 왜일까??
flatMapLatest는 가장 마지막으로 생성된 시퀀스. 즉 02엘리먼트에 해당하는 시퀀스의 value만 전달하기 때문이다.
(flatMapLatest는 실제로 01엘리먼트의 value에 10을 곱하여 30이라는 값을 만들어내지만, 무시된다.)
03엘리먼트에 해당하는 시퀀스가 생겼고, 최초 value인 4에 10을 곱해 40이 전달되었다.
그 다음, 02엘리먼트의 value가 5로 바뀌어 50이 전달되었다.
하지만!! 가장 최근에 추가된 시퀀스는 03엘리먼트에 해당하는 시퀀스이기 때문에, 50은 최종 시퀀스에 전달되지 않는다.
그 뒤, 03엘리먼트의 value가 6이되어 60이 전달되었다. 03엘리먼트는 가장 최근에 생성된 시퀀스이기 때문에, 60은 최종 시퀀스로 전달된다.
Ch.7 Transforming Operator
A. 변환연산자의 요소들
기본적으로 Observable은 독립적인 요소들을 방출하지만, table 또는 collection view와 바인딩 하기 위해서 해당 데이터를 조합하거나 변환하는 처럼 이를 활용할 수 있다
1. toArray
2. map
3. enumerated
B. 내부의 Observable 변환하기
1. flatMap
01엘리먼트가 flatMap을 만나 새로운 시퀀스가 생겼다. 이 시퀀스는 01엘리먼트의 value에 대한 시퀀스다.
새로 생성된 시퀀스에 10 이벤트가 발생했고, 최종 시퀀스(제일 하단 시퀀스)로 전달되었다.
즉, 01엘리먼트의 value에 변동이 있으면, 이 시퀀스에 이벤트가 발생하는 것이다.
02엘리먼트가 flatMap을 만나 새로운 시퀀스가 생겼다. 마찬가지로, 이 시퀀스는 02엘리먼트의 value에 대한 시퀀스다.
새로 생성된 시퀀스에 20 이벤트가 발생했고, 최종 시퀀스로 전달되었다.
02엘리먼트의 value에 변동이 있으면, 이 시퀀스에 이벤트가 발생한다. 02도 마찬가지다.
01엘리먼트의 value에 변동이 생겼다. 1에서 4로 바뀐 것이다. (1에서 4로 바뀌는것이 그림에는 표현되지 않았습니다. 그림이 지저분해지니깐)
flatMap이 생성한 시퀀스 중 01엘리먼트에 해당하는 시퀀스에 40이라는 이벤트가 발생하여, 최종 시퀀스로 전달되었다.
02엘리먼트의 value에 변동이 생겼다. 2에서 5로 바뀐 것이다.
그래서, flatMap이 생성한 02엘리먼트에 해당하는 시퀀스에 50이라는 이벤트가 발생했고, 최종 시퀀스로 전달되었다.
2. flapMapLatest
flatMap과 마찬가지로, 01엘리먼트의 value에 해당하는 시퀀스가 생긴다. 01엘리먼트의 최초 value인 1에 10을 곱하여 최종 시퀀스로 전달된다.
마찬가지로, 02엘리먼트의 value에 해당하는 시퀀스가 생긴다. 02엘리먼트의 최초 value인 2에 10을 곱한 값이 최종 시퀀스로 전달된다.
그 뒤에, 01엘리먼트의 value가 3으로 바뀌었나보다. 30이 전달된걸 보니...하지만 최종 시퀀스에는 전달되지 않는다. 왜일까??
flatMapLatest는 가장 마지막으로 생성된 시퀀스. 즉 02엘리먼트에 해당하는 시퀀스의 value만 전달하기 때문이다.
(flatMapLatest는 실제로 01엘리먼트의 value에 10을 곱하여 30이라는 값을 만들어내지만, 무시된다.)
03엘리먼트에 해당하는 시퀀스가 생겼고, 최초 value인 4에 10을 곱해 40이 전달되었다.
그 다음, 02엘리먼트의 value가 5로 바뀌어 50이 전달되었다.
하지만!! 가장 최근에 추가된 시퀀스는 03엘리먼트에 해당하는 시퀀스이기 때문에, 50은 최종 시퀀스에 전달되지 않는다.
그 뒤, 03엘리먼트의 value가 6이되어 60이 전달되었다. 03엘리먼트는 가장 최근에 생성된 시퀀스이기 때문에, 60은 최종 시퀀스로 전달된다.
3. 사용 예시
C. 이벤트 관찰하기
80
85
Unhandled error happened: anError
80
85
anError
100
The text was updated successfully, but these errors were encountered: