跟踪值
跟踪值
是一个struct
,用于确定一个值是否已更改。
原始想法:ReactorKit#74
示例
var v1 = TrackedValue(1)
let v2 = v1
v1 == v2 // true
v1.value = 1 // same value but new one assigned
v1 == v2 // false
使用案例
final class LoginReactor: Reactor {
enum Action {
case login
}
struct State {
var error: Error?
}
let initialState = State()
}
final class LoginViewController: UIViewController, View {
func bind(reactor: LoginReactor) {
reactor.state.map { $0.error }
// For some reasons, we need to skip if the error is same instance.
// We can not use `distinctUntilChanged` here. 😭
// Becase `Error` protocol is not `Equatable`.
.distinctUntilChanged()
.bind { [weak self] in self?.showError($0) }
.disposed(by: disposeBag)
}
}
如果我们使用跟踪值
,我们可以确定一个值是否已更改,即使原始值不是Equatable
。
final class LoginReactor: Reactor {
enum Action {
case login
}
struct State {
var error: TrackedValue<Error?> = .init(nil)
}
let initialState = State()
}
final class LoginViewController: UIViewController, View {
func bind(reactor: LoginReactor) {
reactor.state.map { $0.error }
// We can use `distinctUntilChanged`! 😀
.distinctUntilChanged()
.bind { [weak self] in self?.showError($0.value) }
.disposed(by: disposeBag)
}
}