RxSwift로 2개의 observe를 정리해, 처리를 1회 밖에 흐르지 않게 한다

9775 단어 SwiftRxSwiftSwift4
잠시만 제목이라고 말하는지 모르겠다.

두 데이터 업데이트를 구독했을 때 문제가 발생했습니다.



komatta.swift
UserDefaults.standard.rx.observe(String.self, "foo")
    .subscribe(
        onNext: {
            // イケてるかもしれない処理を呼び出す
        }
    )

UserDefaults.standard.rx.observe(String.self, "bar")
    .subscribe(
        onNext: {
            // イケてるかもしれない処理を呼び出す
        }
    )

토마, 이런 느낌입니다.
그리고, 이 위의 2개의 함수는 각각 같은 함수……게다가 외부 API를 두드리는 계의 처리를 호출하고 있는군요.
평상시라면 문제 없었습니다만…

그리고 사건이 일어났다.



jiken.swift
UserDefaults.standard.archive(key: "foo", value: "foo_value")
UserDefaults.standard.archive(key: "bar", value: "bar_value")

그래, foo와 bar를 함수내에서 동시에 갱신하는 처리가 나타났습니다…
subscribe하고 있었기 때문에 두 가지가 각각 실행됩니다.

amb이라면 안 됐어…



배타 제어를 생각해 구현하는 등, 어프로치는 여러가지 있는 것에는 있습니다.
단지, 거기는 과연 RxSwift였습니다. 제대로 문제를 해결할 수있는 기능이 있습니다

kawano_nagare_wo_hitotu_ni.swift
let foo = UserDefaults.standard.rx.observe(String.self, "foo")
let bar = UserDefaults.standard.rx.observe(String.self, "bar")

foo.amb(bar).subscribe(
    onNext: {
        // イケてるかもしれない処理を呼び出す
    }
)

amb에 대해서는 여기 에서!

그리고 우키 우키 룬은 느낌으로 구현했지만 좋지 않았습니다.

bakuhatsu.swift
// fooの方が先なので、fooの購読のみ有効になる
let foo = UserDefaults.standard.rx.observe(String.self, "foo")
let bar = UserDefaults.standard.rx.observe(String.self, "bar")


// ...略

// barだけで更新すると、fooの購読だけが有効になっているので動かない!
let bar = UserDefaults.standard.rx.observe(String.self, "bar")



이번에 한 번만 실행되도록



@kakajika 씨에게 지적해 주셔서 대답을 찾았습니다.
코멘트 정말 감사합니다

kondo_koso_kawano_nagare_wo_hitotu_ni.swift
let foo = UserDefaults.standard.rx.observe(String.self, "foo")
let bar = UserDefaults.standard.rx.observe(String.self, "bar")

Observable.of(firstObserve, secondObserve).merge()
    .flatMapFirst {
        // 非同期処理を返却
    }
    .subscribe(
        onNext: { result in
            // 非同期処理の結果を元に、イケてるかもしれない処理を呼び出す
        }
    )

우선 merge 에서 foo와 bar의 observe를 하나로 해 보았습니다.
이번에는 업데이트 될 때마다 두 번 호출되는 것은 변하지 않으므로,
flatMapFirst를 넣어 비동기 처리가 실행중이면 후속 처리를 호출하지 않는다! 라는 바람으로하고 있습니다.

debounce와 throttle 하지만 좋을까? 라고 생각했습니다만, 시간의 설정이 필요하고, 변경의 반영까지 약간입니다만 시간이 걸릴 것 같았으므로, 이 패턴에서는 flatMapFirst만으로 하고 있습니다.

이것이 정상적으로 작동하는지 여부는 ... 테스트가 필요하므로 테스트합니다

좋은 웹페이지 즐겨찾기