분류 전체보기

    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연..

    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으로 지정했기 때문. 버퍼에는 마..