새벽의 기록

[SOPT] RxSwift 스터디 #2 본문

SOPT/RxSwift 스터디

[SOPT] RxSwift 스터디 #2

OneTen 2024. 11. 21. 00:49

rx 사용해서 구구단 만들어 보기!

 

import UIKit
import RxSwift
import RxCocoa
import SnapKit

class Study: UIViewController {
    
    private let disposeBag = DisposeBag()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        multiply()
    }
    
    func multiply() {

        let num1 = Observable.range(start: 1, count: 9)
        let num2 = Observable.range(start: 1, count: 9)
        
        num1.flatMap { first in
            num2.map { second in
                "\\(first) * \\(second) = \\(first * second)"
            }
        }
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)
        
    }
    
}

이렇게 짜니까 flatMap이 순서를 보장하지 않아서 그런지 결과가 뒤죽박죽이었다.

 

 

 

그래서

import UIKit
import RxSwift
import RxCocoa
import SnapKit

class Study: UIViewController {
    
    private let disposeBag = DisposeBag()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        multiply()
    }
    
    func multiply() {

        let num1 = Observable.range(start: 1, count: 9)
        let num2 = Observable.range(start: 1, count: 9)
        
        num1.flatMap { first in
            num2.map { second in
                "\\(first) * \\(second) = \\(first * second)"
            }
            .reduce("\\n\\(first)단 출력", accumulator: {"\\($0)\\n\\($1)"})
        }
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)
        
    }
    
    
}

reduce로 num2의 map 이 끝날 때마다 결합해주니까 순서가 맞춰짐

 

 

 

 

근데 좀 찾아보니까 concatMap이 순서 보장되는 flatMap이라길래 사용해보니

import UIKit
import RxSwift
import RxCocoa
import SnapKit

class Study: UIViewController {
    
    private let disposeBag = DisposeBag()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        multiply()
    }
    
    func multiply() {

        let num1 = Observable.range(start: 1, count: 9)
        let num2 = Observable.range(start: 1, count: 9)
        
        num1.concatMap { first in
            num2.map { second in
                "\\(first) * \\(second) = \\(first * second)"
            }
        }
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)
        
    }
    
    
}

일케 잘 나온다!

'SOPT > RxSwift 스터디' 카테고리의 다른 글

[SOPT] RxSwift 스터디 #1  (0) 2024.11.20
Comments