RxSwift로 2개의 observe를 정리해, 처리를 1회 밖에 흐르지 않게 한다
두 데이터 업데이트를 구독했을 때 문제가 발생했습니다.
komatta.swiftUserDefaults.standard.rx.observe(String.self, "foo")
.subscribe(
onNext: {
// イケてるかもしれない処理を呼び出す
}
)
UserDefaults.standard.rx.observe(String.self, "bar")
.subscribe(
onNext: {
// イケてるかもしれない処理を呼び出す
}
)
토마, 이런 느낌입니다.
그리고, 이 위의 2개의 함수는 각각 같은 함수……게다가 외부 API를 두드리는 계의 처리를 호출하고 있는군요.
평상시라면 문제 없었습니다만…
그리고 사건이 일어났다.
jiken.swiftUserDefaults.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.swiftlet 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.swiftlet 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만으로 하고 있습니다.
이것이 정상적으로 작동하는지 여부는 ... 테스트가 필요하므로 테스트합니다
Reference
이 문제에 관하여(RxSwift로 2개의 observe를 정리해, 처리를 1회 밖에 흐르지 않게 한다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/fumihiko-hidaka/items/40908e41d090cdb51a12
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
UserDefaults.standard.rx.observe(String.self, "foo")
.subscribe(
onNext: {
// イケてるかもしれない処理を呼び出す
}
)
UserDefaults.standard.rx.observe(String.self, "bar")
.subscribe(
onNext: {
// イケてるかもしれない処理を呼び出す
}
)
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.swiftlet 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.swiftlet 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만으로 하고 있습니다.
이것이 정상적으로 작동하는지 여부는 ... 테스트가 필요하므로 테스트합니다
Reference
이 문제에 관하여(RxSwift로 2개의 observe를 정리해, 처리를 1회 밖에 흐르지 않게 한다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/fumihiko-hidaka/items/40908e41d090cdb51a12
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
let foo = UserDefaults.standard.rx.observe(String.self, "foo")
let bar = UserDefaults.standard.rx.observe(String.self, "bar")
foo.amb(bar).subscribe(
onNext: {
// イケてるかもしれない処理を呼び出す
}
)
// 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만으로 하고 있습니다.
이것이 정상적으로 작동하는지 여부는 ... 테스트가 필요하므로 테스트합니다
Reference
이 문제에 관하여(RxSwift로 2개의 observe를 정리해, 처리를 1회 밖에 흐르지 않게 한다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/fumihiko-hidaka/items/40908e41d090cdb51a12텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)