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

  1. //
  2. // Rx+UserDefaultsWrapper.swift
  3. // GME Remit
  4. //
  5. // Created by InKwon James Kim on 2020/01/10.
  6. // Copyright © 2020 Gobal Money Express Co. Ltd. All rights reserved.
  7. //
  8. import RxSwift
  9. import RxCocoa
  10. extension UserDefaultsWrapper: ReactiveCompatible {}
  11. extension Reactive where Base: UserDefaults {
  12. public func `default`<E: Equatable>(_ type: E.Type, _ keyPath: String) -> Observable<E?> {
  13. let center = NotificationCenter.default
  14. let initial = base.object(forKey: keyPath) as? E
  15. let changes = center.rx.notification(UserDefaults.didChangeNotification)
  16. .map { _ in
  17. self.base.object(forKey: keyPath) as? E
  18. }
  19. return Observable<E?>.just(initial)
  20. .concat(changes)
  21. .distinctUntilChanged { previous, next in
  22. guard let previous = previous, let next = next else {
  23. return false
  24. }
  25. return previous == next
  26. }
  27. }
  28. }
  29. extension Reactive where Base: UserDefaultsWrapper<GMEDB.UserKeys> {
  30. func set(key: GMEDB.UserKeys) -> Binder<String?> {
  31. return Binder(self.base) { db, value in
  32. db.set(value, key)
  33. }
  34. }
  35. func string(key: GMEDB.UserKeys) -> Observable<String?> {
  36. return UserDefaults.standard.rx.default(String.self, key.rawValue)
  37. }
  38. }