This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import RxSwift | |
| import RxCocoa | |
| final class Toggle { | |
| // MARK: - Properties | |
| private let storage: ToggleStorage | |
| // MARK: - Initializer |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| enum ToggleValue { | |
| /// Initial value read from storage | |
| case initial(Bool) | |
| /// Updated value after successfully saving in storage | |
| case updated(Bool) | |
| /// Fallback value after unsuccessfully saving in storage | |
| case fallback(Bool) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| func manage(change: Observable<Bool>) -> (value: Driver<ToggleValue>, isBusy: Driver<Bool>) { | |
| // ... | |
| let initialValue = storage | |
| .read() | |
| .map { ToggleValue.initial($0) } | |
| .catchError { Observable.just( ToggleValue.unknown($0) ) } | |
| // ... | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| func manage(change: Observable<Bool>) -> (value: Driver<ToggleValue>, isBusy: Driver<Bool>) { | |
| // ... | |
| let storage = self.storage | |
| let valueAfterSaving = change | |
| .flatMap { valueToSave -> Observable<ToggleValue> in | |
| storage | |
| .save(value: valueToSave) | |
| .map { ToggleValue.updated(valueToSave) } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| func manage(change: Observable<Bool>) -> (value: Driver<ToggleValue>, isBusy: Driver<Bool>) { | |
| let storage = self.storage | |
| let initialValue = storage | |
| .read() | |
| .map { ToggleValue.initial($0) } | |
| .catchError { Observable.just( ToggleValue.unknown($0) ) } | |
| let valueAfterSaving = change | |
| .flatMap { valueToSave -> Observable<ToggleValue> in |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| func manage(change: Observable<Bool>) -> (value: Driver<ToggleValue>, isBusy: Driver<Bool>) { | |
| let storage = self.storage | |
| let isBusySubject = PublishSubject<Bool>() | |
| let isBusy = isBusySubject | |
| .asDriver(onErrorJustReturn: false) | |
| .startWith(true) | |
| let initialValue = storage | |
| .read() |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import UIKit | |
| import RxCocoa | |
| import RxSwift | |
| class SettingsViewController: UIViewController { | |
| @IBOutlet weak var settingSwitch1: UISwitch! | |
| @IBOutlet weak var settingSwitch2: UISwitch! | |
| @IBOutlet weak var settingSwitch3: UISwitch! | |
| @IBOutlet weak var settingSwitch4: UISwitch! |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| private func setUp(settingSwitch: UISwitch, with toggle: Toggle) { | |
| let (value, isBusy) = toggle.manage(change: settingSwitch.rx.isOn.changed.asObservable()) | |
| let initialValue = value | |
| .filter { $0.isInitial } | |
| .map { $0.value } | |
| .flatMap { $0.map(Driver.just) ?? Driver.empty() } // .unwrap() if using `RxSwiftExt` | |
| let fallbackValue = value | |
| .filter { $0.isFallback } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| extension ToggleValue { | |
| var value: Bool? { | |
| switch self { | |
| case .initial(let value), .updated(let value), .fallback(let value): | |
| return value | |
| case .unknown: | |
| return nil | |
| } | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| private func setUp(settingSwitch: UISwitch, with toggle: Toggle) { | |
| let (value, isBusy) = toggle.manage(change: settingSwitch.rx.isOn.changed.asObservable()) | |
| // ... | |
| let isSwitchDisabled = isBusy | |
| .map { !$0 } | |
| isSwitchDisabled | |
| .drive(settingSwitch.rx.isEnabled) |