RxSwift + MVVM

    RxSwift(15). filter

    filter를 활용해서 옵저버블이 방출하는 요소를 필터링할 수 있다. filter연산자는 클로저를 파라미터로 받는다. 이 클로저는 predicate로 사용된다. 여기에서 true를 리턴하는 요소가 옵저버블이 리턴하는 요소가된다. 지금은 짝수인 경우에 방출하도록 한다. let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] Observable.from(numbers) .filter{ $0.isMultiple(of: 2) } .subscribe{ print($0) } .disposed(by: disposeBag) //next(2) //next(4) //next(6) //next(8) //next(10) //completed

    RxSwift(14). elementAt

    elementAt는 특정 인덱스에 위치한 요소를 제한적으로 방출한다. elementAt은 정수 index를 파라미터로 받아서 옵저버블을 방출한다. 연산자가 리턴하는 옵저버블은 해당 인덱스에 있는 하나의 요소를 방출하고 이어서 CompletedEvent를 전달한다. 결과적으로 하나만 방출하고 원본 옵저버블에 있는 나머지 요소는 무시된다. let fruits = ["🍏", "🍎", "🍋", "🍓", "🍇"] Observable.from(fruits) .element(at: 1) .subscribe{ print($0) } .disposed(by: disposeBag) //next(🍎) //completed

    RxSwift(13). ignoreElements

    ignoreElements연산자는 옵저버블이 방출하는 NextEvent를 필터링하고 CompletedEvent와 ErrorEvent만 구독자로 전달한다. let fruits = ["🍏", "🍎", "🍋", "🍓", "🍇"] Observable.from(fruits) .subscribe{ print($0) } .disposed(by: disposeBag) //next(🍏) //next(🍎) //next(🍋) //next(🍓) //next(🍇) //completed 과일 문자열을 방출하는 옵저버블이다. 아직 필터링 하지 않았고 문자열을 방출한 다음 Completed가 방출된다. ignoreElements연산자로 NextEvent를 필터링할 수 있다. ignoreElements연산자는 파라미터를 받지 않는다...

    RxSwift(12). Relays

    RxSwift는 세가지 Relays를 제공한다. PublishRelay 서브젝트와 유사한 특징을 가지고 있고 내부에 서브젝트를 래핑하고있다. PublishRelay는 PublishSubject를 래핑하고 있다 BehaviorRelay BehaviorRelay는 BehaviorSubject를 래핑하고있다 ReplayRelay ReplayRelay는 ReplayRelay를 래핑하고 있다. Relay는 서브젝트와 마찬가지로 다른소스로부터 이벤트를 받아서 구독자로 전달한다. 가장 큰 차이는 NextEvent만 전달한다는것이다. CompleteEvent와 ErrorEvent는 전달 받지도 않고 전달하지도 않는다. 그래서 앞에서 공부한 서브젝트와 달리 종료되지 않는다. 구독자가 disposed되기 전까지 계속 이벤..

    RxSwift(11). AsyncSubject

    AsyncSubject는 Event를 전달하는 시점에 차이가 있다. 다른 서브젝트들은 서브젝트로 이벤트가 전달되면 즉시 구독자에게 전달한다. 반면 AsyncSubject는 서브젝트로 CompletedEvent가 전달되기 전까지 어떠한 이벤트도 전달하지 않는다. CompletedEvent가 전달되면 그 시점에 가장 최근에 저장된NextEvent 하나를 구독자에게 전달한다. let subject = AsyncSubject() subject.subscribe{ print($0)} .disposed(by: bag) subject.onNext(1) 아직 CompletedEvent가 전달되지 않았기 때문에 NextEvent가 구독자에게 전달되지 않는다. let subject = AsyncSubject() subje..

    RxSwift(10). ReplaySubject

    두개이상의 이벤트를 저장해두고 새로운 구독자로 전달하고 싶다면 ReplaySubject를 사용한다. ReplaySubject는 생성자가 아닌 create메서드로 생성한다. 그리고 버퍼의 사이즈를 전달하는데 N을 입력하면 N개의 이벤트를 저장한다. let rs = ReplaySubject.create(bufferSize: 3) (1...10).forEach{ rs.onNext($0)} rs.subscribe{ print("Observer1 >> ", $0)} .disposed(by: disposeBag) //Observer1 >> next(8) //Observer1 >> next(9) //Observer1 >> next(10) 3개의 next가 나온 이유는 버퍼의 크기를 3으로 지정했기 때문. 버퍼에는 마..

    RxSwift(9). BehaviorSubject

    BehaviorSubject는 PublishSubject와 유사한 방식으로 동작한다. 서브젝트로 전달된 이벤트를 구독자로 전달하는것은 동일하다. 하지만 서브젝트를 생성하는 방식에 차이가 있다. let p = PublishSubject() //PublishSubject는 빈 생성자를 사용 let b = BehaviorSubject(value: 0) //BehaviorSubject는 하나의 값을 전달한다. 또다른 차이는 서브젝트를 구독할 때 차이가 있다. let p = PublishSubject() p.subscribe{ print("PublishSubject >>", $0)} .disposed(by: disposeBag) --------------------------------------- let b =..

    RxSwift(9). PublishSubject

    PublishSubject는 서브젝트로 전달되는 이벤트를 옵저버에게 전달하는 가장 기본적인 형태의 서브젝트. let disposeBag = DisposeBag() enum MyError: Error { case error } let subject = PublishSubject() //타입파라미터를 문자열로 하고있다. //문자열이 포함된 NextEvent를 받아서 다른 옵저버에게 전달할 수 있다. //생성자를 호출할때에는 파라미터를 전달하지 않는다. //이 서브젝트는 비어있는 상태로 생성된다. //서브젝트가 생성되는 시점에는 내부에 아무런 이벤트가 저장되어있지 않는다. 생성 직후에 옵저버가 구독을 시작하면 아무런 이벤트도 전달되지 않는다. 서브젝트는 옵저버블인 동시에 옵저버다. 다른 소스로부터 이벤트를 전..

    RxSwift(8). Subject

    Observable은 Observer에 Event를 전달한다. Observer은 Observable을 구독하고 전달되는 Event를 처리한다. Observable은 다른 Observable을 구독하지 못한다. Observer는 다른 Observer로 Event를 전달하지 못한다. 반면 Subject는 다른 Observable에서 Event를 받아서 구독자로 전달할 수 있다. Subject는 Observable인 동시에 Observer이다. RxSwift는 4가지 Subject를 제공한다. PublishSubject BehaviorSubject ReplaySubject AsyncSubject PublishSubject: 가장 기본적인 Subject, Subject로 전달되는 새로운 Event를 구독자로 전..

    RxSwift(7). Operators(연산자)

    RxSwift가 제공하는 여러가지 타입중에서 ObservableType이란 프로토콜이 있다 여기엔 RxSwift의 근간을 이루는 다양한 메서드들이 선언되어 있다. 새로운 Observable을 생성하는 메서드, 방출되는 요소를 필터링 하거나, 여러 Observable을 하나로 합치는 메서드도 있다. RxSwift에선 이런 메서드들을 연산자라고 부른다. Operators는 여러 특징이 있다. 대부분의 연산자는 Observable상에서 동작하고, 새로운 Observable을 리턴한다. Observable을 리턴하기 때문에 두개 이상의 연산자를 연달아 호출할 수 있다. let bag = DisposeBag() Observable.from([1, 2, 3, 4, 5, 6, 7, 8, 9]) //여기 .subscr..