RxSwift + MVVM

    RxSwift(25). withLatestFrom, sample, switchLatest, reduce

    withLatestFrom 이 연산자는 ✧ㅏ래 형태로 사용된다. triggerObservable.withLatestFrom(dataObservable) 연산자를 호출하는 옵저버블을 트리거옵저버블이라부른다 파라미터로 전달하는 옵저버블을 데이터옵저버블이라부른다. 트리거옵저버블이 NE를 방출하면 데이터 옵저버블이 가장 최근에 방출한 NE를 구독자에게 전달한다. 예를들어 회원가입버튼을 탭하는 시점에 TextField에 입력된 값을 가져오는 기능을 구현할 때 활용할 수 있다. public func withLatestFrom(_ second: Source, resultSelector: @escaping (Element, Source.Element) throws -> ResultType) -> Observable {..

    RxSwift(24). startWith, concat, merge, combineLatest, zip

    startWith startWith는 옵저버블이 요소를 방출하기 전에 다른 항목들을 앞부분에 추가한다 주로 기본값이나 시작값을 지정할 때 활용된다. public func startWith(_ elements: Element ...) -> Observable { return StartWith(source: self.asObservable(), elements: elements) } startWith연산자의 파라미터는 가변파라미터이다. 파라미터로 전달하는 하나 이상의 값을 옵저버블 시퀀스 앞부분에 추가한다. 그런다음 새로운 옵저버블을 리턴한다. let numbers = [1, 2, 3, 4, 5] Observable.from(numbers) .startWith(-1, -2) .startWith(-3) .su..

    RxSwift(23). concatMap, scan, buffer, Window, groupBy

    concatMap concatMap은 flatMap과 비교하면 쉽게 이해된다. let redCircle = "🔴" let greenCircle = "🟢" let blueCircle = "🔵" let redHeart = "❤️" let greenHeart = "💚" let blueHeart = "💙" Observable.from([redCircle, greenCircle, blueCircle]) .flatMap { circle -> Observable in switch circle { case redCircle: return Observable.repeatElement(redHeart) .take(5) case greenCircle: return Observable.repeatElement(greenHea..

    RxSwift(22). CreateOperators(just, of, from)(range, generate)(repeatElement)(deferred)(create)(empty, error)

    (just, of, from) just just는 하나의 항목을 방출하는 옵저버블을 생성한다. 이 연산자는 옵저버블타입 프로토콜에 타입 메서드 로 선언되어있다. 파라미터로 하나의 요소를 받아서 옵저버블을 리턴한다. let element = "😀" Observable.just(element) 파라미터로 element(문자열)를 전달하면 이 문자열을 방출하는 옵저버블이 생성된다. let element = "😀" Observable.just(element) .subscribe{ event in print(event)} .disposed(by: disposeBag) //next(😀) //completed Observable.just([1, 2, 3]) .subscribe{ event in print(event)..

    RxSwift(21). toArray, map, compactMap, flatMap, flatMapFirst, flatMapLatest

    toArray 이 연산자는 옵저버블이 방출하는 모든 요소를 배열에 담은 다음 이 배열을 방출하는 옵저버블을 생성한다. 이 연산자는 별도의 파라미터를 받지 않는다. 하나의 요소를 방출하는 옵저버블로 변환하는데 더 정확히는 Single로 변환한다. Single는 하나의 요소를 방출하거나 ErrorEvent를 전달하는 특별한 옵저버블이다. 하나의 요소를 방출한 다음 바로 종료된다. let subject = PublishSubject() subject .toArray() .subscribe{ print($0) } .disposed(by: disposeBag) subject.onNext(1) 방출한 숫자가 구독자로 바로 전달되지 않는다. toArray는 소스 옵저버블이 방출하는 모든 요소를 하나의 배열에 담는다...

    RxSwift(20). debounce, throttle

    debounce, throttle는 짧은 시간동안 반복적으로 방출되는 이벤트를 제어한다는 공통점이 있다. 연산자로 전달하는 파라미터도 동일하다. 하지만 연산의 결과는 완벽히 다르기 때문에 잘 구분해서 사용해야한다. 공통 let buttonTap = Observable.create { observer in DispatchQueue.global().async { //0.3초 주기로 nextEvent를 10번 방출한다 for i in 1...10 { observer.onNext("Tap \(i)") Thread.sleep(forTimeInterval: 0.3) } //1초동안 중지하고 Thread.sleep(forTimeInterval: 1) //0.5초 주기로 10번 방출한다 for i in 11...20 ..

    RxSwift(19).distinctUntilChanged

    distinctUntilChanged 옵저버블에서 방출하는 이벤트를 순서대로 비교한 다음 이전 이벤트와 동일하다면 방출하지 않는다. 이벤트를 비교할 때에는 비교 연산자를 사용해서 포함되어있는 값을 비교한다. let numbers = [1, 1, 3, 2, 2, 3, 1, 5, 5, 7, 7, 7] Observable.from(numbers) .distinctUntilChanged() .subscribe{ print($0)} .disposed(by: disposeBag) //next(1) //next(3) //next(2) //next(3) //next(1) //next(5) //next(7) //completed 동일한 요소가 연속적으로 방출된게 아니라면 방출한다. 이전 이벤트와 다르다면 이미 방출했더라..

    RxSwift(18). single

    single연산자는 원본 옵저버블에서 첫 요소만 방출하거나 조건과 일치하는 첫 요소만 방출한다. 이름처럼 하나의 요소만 방출하고 두개이상의 요소가 방출될 때는 에러가 발생한다. let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] Observable.just(1) .single() .subscribe{print($0)} .disposed(by: disposeBag) Observable.from(numbers) .single() .subscribe{print($0)} .disposed(by: disposeBag) //next(1) //completed //next(1) //error(Sequence contains more than one element.) 하나의 요소를 방출할..

    RxSwift(17). take, takeuntill, takewhile, takeLast, take(for:)

    take연산자는 여러가지 버전이 있다. take take는 정수를 파라미터로 받아서 해당 숫자만큼만 이벤트를 방출한다. let disposeBag = DisposeBag() let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] Observable.from(numbers) .take(5) .subscribe{print($0)} .disposed(by: disposeBag) //next(1) //next(2) //next(3) //next(4) //next(5) //completed take로 전달된 5개만 방출한다 take연산자는 NextEvent이외엔 관여하지 않아서 마지막에 CompletedEvent || ErrorEvent를 전달한다. takeuntill takeuntil..

    RxSwift(16). skip, skipWhile, skipUntil, skipduration

    skip 연산자는 특정 요소를 무시하는 연산자이다. skip skip연산자는 정수를 파라미터로 받는다. 옵저버블이 방출하는 요소중에서 지정된 수만큼 무시한 다음에 이후에 방출되는 요소만 구독자로 전달한다. let disposeBag = DisposeBag() let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] Observable.from(numbers) .skip(3) .subscribe{ print($0)} //next(4) //next(5) //next(6) //next(7) //next(8) //next(9) //next(10) //completed 결과를 보면 4부터 방출된다. 지정한 3개의 요소 1, 2, 3을 무시하고 다음부터 방출한다. 코딩을 하다보면 skip연..