티스토리 뷰

Mobile/iOS

RxSwift. Observable combine

out of coding 2018. 6. 19. 18:29

RxSwift로 흐름에 따라 값의 변화에 따라서 처리를 하고 이것을 자연스럽게 합쳐서 사용할 수 있습니다.


이번에는 Combine 할수 있는 함수들을 알아보도록 하겠습니다.


1. combineLatest


1
2
3
4
5
6
7
8
let first = Observable.of(1234)
let second = Observable.of(100200300400)
 
Observable.combineLatest(first, second) { first, second -> String in
    return "\(first), \(second)"
}.subscribe(onNext: { text in
    print("text = \(text)")
}).disposed(by: disposeBag)
cs


마지막으로 들어온 값들을 사용할 수 있도록 하여줍니다.


1
2
3
4
5
6
7
text = 1100
text = 2100
text = 2200
text = 3200
text = 3300
text = 4300
text = 4400
cs


이렇게 자신들이 하나씩 방출하면서 마지막 값들을 나오게 하는 겁니다.


2. withLatestFrom


1
2
3
4
5
6
7
let first = Observable.of(1234)
let second = Observable.of(100200300400500)
        
first.withLatestFrom(second)
    .subscribe(onNext: { text in
        print("text = \(text)")
    }).disposed(by: disposeBag)
cs


자신이 변화됨에 따라 다른 흐름을 참조하여서 가져오게 됩니다.


1
2
3
4
text = 100
text = 200
text = 300
text = 400
cs


결과값중 왜 500은 나오지 않았을 까요?

이유는 first가 4번만 방출하기 때문에 이 값을 사용할 수 없게 됩니다.


3. merge


1
2
3
4
5
6
7
let first = Observable.of(1234)
let second = Observable.of(100200300400500)
 
Observable.merge(first, second)
    .subscribe(onNext: { text in
        print("text = \(text)")
    }).disposed(by: disposeBag)
cs


값들을 하나로 합쳐서 하나의 흐름으로 만들어 줍니다.


1
2
3
4
5
6
7
8
9
text = 1
text = 100
text = 2
text = 200
text = 3
text = 300
text = 4
text = 400
text = 500
cs


차례대로 수루룩하고 나오게 됩니다.


4. switchLatest


1
2
3
4
5
6
7
8
9
10
11
12
13
let first = PublishSubject<Int>()
let second = PublishSubject<Int>()
let switchTest = BehaviorSubject(value: first)
 
switchTest
    .switchLatest()
    .subscribe(onNext: { number in
        print("text = \(number)")
    }).disposed(by: disposeBag)
 
first.onNext(1)
switchTest.onNext(second)
second.onNext(2)
cs


위에서 보면 PublishSubject로 하나의 이벤트를 만들수 있는 객체를 두개 만들었습니다. first, second 이것을 가지고 switchTest에서 생성시에 사용을 하도록 지정하였습니다.


이후 12번째 라인에서 이벤트를 방출할수 있는 흐름을 second로 변경을 하였고 이후에는 second의 값에 따라서 switchTest가 동작하게 됩니다.


1
2
text = 1
text = 2
cs


5. zip


1
2
3
4
5
6
7
let first = Observable.of(1234)
let second = Observable.of(100200300400500)
 
Observable.zip(first, second)
    .subscribe(onNext: { first, second in
        print("value = \(first), \(second)")
    }).disposed(by: disposeBag)
cs


이건 순서대로 방출된 이벤트를 하나로 묶어줍니다.

같은 순서의 이벤트를 합쳐주는겁니다.


1
2
3
4
value = 1100
value = 2200
value = 3300
value = 4400
cs


6. concat


1
2
3
4
5
6
7
let first = Observable.of(1234)
let second = Observable.of(100200300400500)
 
Observable.concat(first, second)
    .subscribe(onNext: { number in
        print("value = \(number)")
    }).disposed(by: disposeBag)
cs


두개의 흐름을 하나의 흐름으로 만들어줍니다.

직렬로 연결이 되고 출력은 다음과 같습니다.


1
2
3
4
5
6
7
8
9
value = 1
value = 2
value = 3
value = 4
value = 100
value = 200
value = 300
value = 400
value = 500
cs


'Mobile > iOS' 카테고리의 다른 글

Swift. reflection.  (0) 2018.06.24
Swift. Custom ViewController Transition. Present  (0) 2018.06.24
RxSwift. Transforming Observable  (0) 2018.06.19
Swift. Codable Encoding (1)  (0) 2018.06.17
Swift. Codable Decoding (1)  (0) 2018.06.17
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함