본문 바로가기

RxSwift14

[RxSwift] Deferred deferred 구독자가 구독하기 전까지 옵저버블을 생성을 지연시켜, 구독 시점에 각 구독자 별로 새로운 옵저버블을 생성 구독 시점에 항상 Observable 을 생성하므로 최신 데이터를 제공하는 데 사용될 수 있음. (네트워크 요청 등) 구현부 public static func deferred(_ observableFactory: @escaping () throws -> Observable) -> Observable { Deferred(observableFactory: observableFactory) } 예시 코드 func createObservable() -> Observable { return Observable.just(Date().timeIntervalSince1970) } Observable.. 2024. 3. 11.
[RxSwift] Relay Relay Subject Wrapping 하여 기능 확장 Subject 와 유사하지만 Next 이벤트만 발생하며, Completed 와 Error 이벤트는 발생하지 않음.→ 스트림이 계속 유지되어 UI Event 와 바인딩하여 사용하기 적합 Dispose() 호출되어야 메모리 해제 RxCocoa 임포트 필수 .accept 로 데이터 방출 PublishRelay 또는 BehaviorRelay 는 기존 PublishSubject 와 BehaviorSubject 를 Wrapping 한 것으로 기존 개념은 Publish 와 Relay 차이 말고는 같은 방식 Subject 대신 Relay 를 사용하는 이유 Subject 는 메모리 관리가 명확하지 않아 메모리 누수가 발생할 가능성이 있지만 Relay 는 Dispo.. 2024. 3. 11.
[RxSwift] Traits Part 2. RxCocoa Traits RxSwift Traits 기반으로 UI 개발을 위해 특화된 RxCocoa 에서 사용하는 Wrapper 구조체 Driver UI 계층에서 반응형 코드를 작성하는 직관적인 방법을 제공하거나 앱을 Driving 하는 데이터 스트림을 모델링하는 데 사용됨 error 을 방출하지 않음, 시퀀스 오류가 발생하더라도 앱은 input 에 대해서 반응하지 않음. Main Scheduler 사이드 이펙트를 공유함(share(replay: 1, scope: .whileConnected)) 기본 값으로 가장 최근에 방출했던 아이템 값을 방출함. 구독할 때마다 새로운 Observable 이 생성되지 않고 공유할 수 있음. .while Connected: Subscriber 가 0개가 되고 dispo.. 2024. 3. 8.
[RxSwift] Traits Part 1. RxSwift Trait 관한 내용을 기록합니다. Traits Observable 시퀀스의 특성을 정의하는 Wrapper 구조체 직관적이고 작성하기 쉬운 코드를 작성하는데 도움을 줌 .asObservable() 호출을 통해 Observable 시퀀스로 변환될 수 있음. Traits 사용 이점 코드 간결성 및 가독성 향상 특정 상황에 맞는 Observable 시퀀스 생성 및 사용 용이 유지 관리 및 테스트 용이성 향상 Single 단일 element 또는 error를 방출 API 호출 결과 값 또는 데이터베이스에서 단일 레코드를 가져올 때 유용 .asSingle() 호출을 통해 Single 로 변환 가능 API 결과 예시 func fetchAllItems() -> Single { return Single... 2024. 3. 8.
[RxSwift] Error Handling RxSwift에서 에러 핸들링에 관한 내용을 기록합니다. RxSwift에서의 에러 관리 Catch error 를 새로운 Observable 또는 값으로 처리 catch(_ handler:) 클로저를 매개변수로 받아 완전히 다른 형태의 observable로 변환 public func `catch`(_ handler: @escaping (Swift.Error) throws -> PrimitiveSequence) -> PrimitiveSequence { PrimitiveSequence(raw: self.source.catch { try handler($0).asObservable() }) } 예시 func getUser(id: Int) -> Observable { return network.getUser(id.. 2024. 3. 8.
[RxSwift] Time Based Operators Time Based Operators 에 관해 정리한 내용을 기록합니다. Time Based Operators Interval 주어진 시간 간격을 두고 주기마다 방출되는 Operator completed 되지 않고 무한한 시퀀스를 생성한다. disposed 하지 않으면 구독 이후 계속 반복하여 방출한다. public static func interval(_ period: RxTimeInterval, scheduler: SchedulerType) -> Observable { return Timer( period: period, // 이벤트가 방출되는 주기 scheduler: scheduler // 스케쥴러 설정 ) } Observable .interval(.seconds(3), scheduler: Main.. 2022. 7. 18.
[RxSwift] Extension Reactive Extension Reactive에 관한 내용을 기록합니다. RxSwift 라이브러리 코드 중 Reactive.swift 안에 코드와 주석을 보면 Extend Reactive protocol with constrain on Base Put any specific reactive extension for SomeType here Base에 특정 타입을 지정해서 Reactive를 확장해서 사용하라 합니다. @dynamicMemberLookup public struct Reactive { /// Base object to extend. public let base: Base /// Creates extensions with base object. /// /// - parameter base: Base obje.. 2022. 7. 14.
[RxSwift] Combining Operators Combining Operators 에 관해 정리한 내용을 기록합니다. Combining Operators startWith 요소들의 스트림을 방출하기 전에 설정한 요소를 처음으로 시작하여 스트림을 진행할 수 있다. 현재 상태, 위치나 네트워크 연결 상태 등과 같은 데에 사용한다. Observable.of(2, 3) .startWith(1) .subscribe(onNext: { print($0) }) .disposed(by: bag) /* 1 2 3 */ concat 두 개의 스트림을 연결한 것이다. let firstObservables = Observable.of(1,1,1) let secondObservables = Observable.of(2,2) firstObservables .concat(sec.. 2022. 5. 26.
[RxSwift] Transforming Operators Transforming Operators 에 관해 정리한 내용을 기록합니다. Transforming Operators toArray Observable을 다른 객체 또는 자료 구조로 변환한다. Observable.of(1,2,3,4) .toArray() .subscribe(onSuccess: { print($0) }) .disposed(by: bag) // [1,2,3,4] map Observable에서 방출된 각각의 요소를 원하는 함수를 적용하여 변환한다. 기존 map과 동일하게 작동하고 Observable에서 동작한다는 점이 다르다. Observable.range(start: 1, count: 3) .map { $0 * $0 } .subscribe(onNext: { print($0, terminato.. 2022. 1. 2.
[RxSwift] Filtering Operators (Taking) Filtering Operators 중 Taking Operators에 관해 정리한 내용을 기록합니다. Taking Operators take take 는 skip 의 반대 개념이며 처음부터 n 번째까지 방출할 수 있다. Observable.of(1,2,3,4,5) .take(3) .subscribe(onNext: { print($0, terminator: " ") }) .disposed(by: bag) // 1 2 3 takeWhile takeWhile body 내에서 설정한 로직에 따라 false 전까지만 방출한다. skipWhile과 비슷하다. Observable.of(1,3,5,7,9) .enumerated() .take(while: { $0.index < 4 && $0.element % 2 ==.. 2022. 1. 1.