RxSwift 종속성

RxSwift 종속성

RxSwift를 사용해 본 적이 있다면 다음 코드 스니펫에 익숙할 것입니다.

var taskChangeEvent = BehaviorSubject<Bool>()
...

if newValue != oldValue {
  subject.onNext(newValue)
}

...

taskChangeEvent.subscribe(onNext: { [weak self] done in
    ....
}).dispose(by: disposeBag)

이 프로세스를 좀 더 간단하게 만들고 단일 위치에 대한 RxSwift 종속성을 줄이기 위해 이 단계를 수행하는 간단한 클래스를 빌드합니다.

import RxSwift

class EventSerializer<T: Equatable> {
    private var disposeBag = DisposeBag()
    fileprivate let contactPoint: BehaviorSubject<T>
    var value: T

    func send(_ newValue: T) {
        contactPoint.onNext(newValue)
        self.value = newValue
    }
    func sendValueIf(_ newValue: T, compareWith: (_ oldValue: T, _ newValue: T) -> Bool) {
        if compareWith(self.value, newValue) {
            contactPoint.onNext(newValue)
            self.value = newValue
        }
    }
    func listen(onChange: @escaping ((T) -> Void)) {
        contactPoint.subscribe( onNext: { value in
            onChange(value)
        }).disposed(by: disposeBag)
    }
    init(defaultValue: T, contactPoint: BehaviorSubject<T>? = nil) {
        self.contactPoint = contactPoint ?? BehaviorSubject<T>(value: defaultValue)
        self.value = defaultValue
    }
}

발사 로직은 클래스 내부에 있으며 로직을 별도의 함수로 나눌 수 있습니다.

스트림을 듣는 것이 훨씬 깨끗하고 코드 전체에 disposeBag가 없습니다.

var task = EventSerilizer<Bool>(defaultValue: false)

...

func shouldInformTaskChange(_ oldValue: Bool, _ newValue: Bool) {
    oldValue != newValue
}
task.sendValueIf(true, compareWith: shouldInforTaskChange)

...

task.listen { [weak self] value in 
    ....
}

func listenToCombineLatest<E: Equatable>(with otherSerializer: EventSerializer<E>, onChange: @escaping ((T, E) -> Void)) {
    Observable.combineLatest(self.contactPoint, otherSerializer.contactPoint).subscribe(onNext: { tValue, eValue in
        onChange(tValue, eValue)
    }).disposed(by: disposeBag)
}

BehaviorSubject 사용에 대한 참고 사항

아시다시피 BehaviorSubject는 듣기 시작하는 마지막 이벤트를 발행합니다. 이것은 파이프에 물이 있을 때 배관과 같기 때문에 설정 단계에서 문제가 될 수 있습니다. 아직 준비되지 않은 상태에서 방문하게 됩니다. 반면에 PublishSubject를 사용하면 파이프를 함께 연결한 다음 이벤트를 보낼 수 있습니다.

따라서 이벤트를 수신하기 전에 약간의 준비 시간이 필요한 경우 PublishSubject 사용을 고려하십시오.

Suggested posts

앱 라이프사이클

앱 라이프사이클

: 앱 시작부터 종료까지 주기 : 메모리나 데이터 관리로 사용성 ⬆️ 보안 처리 가능 UIApplication, AppDelegate 상황 : AppDelegate 객체가 UIApplication 객체에서 보낸 메시지를 받아 각각 실행하는 기능 정의 Not Running : 앱이 실행되고 있지 않은 상태Inactive : 앱이 실행되고 있지만 이벤트가 수신되지 않은 상태활성: 앱이 실행 중이고 이벤트가 발생한 상태백그라운드: 앱이 백그라운드에 있지만 코드가 실행 중인 상태서스펜드: 앱이 실행 중인 상태 AppDelegate.swift 파일 SceneDelegate에서 델리게이트 기능이 될 코드를 백그라운드에서 실행하지 않고 실행 iOS 13 이상부터 지원하는 다중 씬 기능에 잘 대응하기 위해 AppDelegate / SceneDelegate AppDelegate 1.

iOS 앱 수명 주기

iOS 앱 수명 주기

⭐ 앱 시작 시 앱을 처음 탭하여 실행할 때 AppDelegate가 호출되는 순서입니다. func application(_:willFinishLaunchingWithOptions) func application(_:didFinishLaunchingWithOptions:) func applicationDidBecomeActive(UIApplication) ⭐ background app 앱이 백그라운드로 이동했을 때 AppDelegate가 호출되는 순서입니다.

Related posts

도메인 이름에 대한 정보 찾기

Brian P. Hogan의 Small, Sharp 소프트웨어 도구에서 발췌

도메인 이름에 대한 정보 찾기

facebook.com에 요청하면 컴퓨터가 도메인 이름을 조회하여 해당 도메인 이름을 IP 주소로 변환하므로 컴퓨터가 해당 연결을 만들 수 있습니다.

작문 실력을 향상시키는 3가지 입증된 방법

글쓰기의 이점과 그렇게 하는 데 도움이 되는 전략

작문 실력을 향상시키는 3가지 입증된 방법

2022년에는 GPT-3가 출시되면서 글쓰기 능력이 덜 중요해진 것 같습니다. AI를 사용하면 글이 서투른 사람들도 양질의 직원을 생성할 수 있습니다.

위협 사냥을 위한 OSINT 수집

위협 사냥을 위한 OSINT 수집

안녕하세요, 사이버 애호가 여러분! 위협 사냥 시리즈에 대한 OSINT에 다시 오신 것을 환영합니다. 첫 번째 기사에서는 OSINT에 대한 개요와 위협 사냥에서의 중요성에 대해 설명했습니다.

직장 혁명: 최고의 전문가들이 하이브리드 및 원격 작업에 대해 논의합니다.

직장 혁명: 최고의 전문가들이 하이브리드 및 원격 작업에 대해 논의합니다.

오늘날 빠르게 진화하는 비즈니스 환경에서 하이브리드 및 원격 작업의 개념은 전례 없는 추진력을 얻었습니다. 기업이 변화하는 직원의 요구와 기대에 지속적으로 적응함에 따라 다양한 분야의 전문가들이 모여 이 혁신적인 작업 방식의 이점, 과제 및 미래에 대해 논의했습니다.