You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
44 lines
1.2 KiB
44 lines
1.2 KiB
//
|
|
// Rx+UserDefaultsWrapper.swift
|
|
// GME Remit
|
|
//
|
|
// Created by InKwon James Kim on 2020/01/10.
|
|
// Copyright © 2020 Gobal Money Express Co. Ltd. All rights reserved.
|
|
//
|
|
|
|
import RxSwift
|
|
import RxCocoa
|
|
|
|
extension UserDefaultsWrapper: ReactiveCompatible {}
|
|
|
|
extension Reactive where Base: UserDefaults {
|
|
public func `default`<E: Equatable>(_ type: E.Type, _ keyPath: String) -> Observable<E?> {
|
|
let center = NotificationCenter.default
|
|
let initial = base.object(forKey: keyPath) as? E
|
|
let changes = center.rx.notification(UserDefaults.didChangeNotification)
|
|
.map { _ in
|
|
self.base.object(forKey: keyPath) as? E
|
|
}
|
|
|
|
return Observable<E?>.just(initial)
|
|
.concat(changes)
|
|
.distinctUntilChanged { previous, next in
|
|
guard let previous = previous, let next = next else {
|
|
return false
|
|
}
|
|
return previous == next
|
|
}
|
|
}
|
|
}
|
|
|
|
extension Reactive where Base: UserDefaultsWrapper<GMEDB.UserKeys> {
|
|
func set(key: GMEDB.UserKeys) -> Binder<String?> {
|
|
return Binder(self.base) { db, value in
|
|
db.set(value, key)
|
|
}
|
|
}
|
|
|
|
func string(key: GMEDB.UserKeys) -> Observable<String?> {
|
|
return UserDefaults.standard.rx.default(String.self, key.rawValue)
|
|
}
|
|
}
|