new funcs

Signed-off-by: Matt Bruce <matt.bruce@verizon.com>
This commit is contained in:
Matt Bruce 2022-08-09 14:36:37 -05:00
parent cd327a7f78
commit 4e6d9b2f9d
5 changed files with 90 additions and 21 deletions

View File

@ -13,14 +13,19 @@ import Combine
open class Control<ModelType: Modelable>: UIControl, ModelHandlerable, ViewProtocol, Resettable {
@Published public var model: ModelType
private var cancellable: AnyCancellable?
private var cancellables = Set<AnyCancellable>()
private var shouldUpdate: Bool = false
open func set(with model: ModelType) {
self.model = model
}
open func onStateChange(viewModel: ModelType) {
open func shouldUpdateView(viewModel: ModelType) -> Bool {
fatalError("Implement shouldUpdateView")
}
open func updateView(viewModel: ModelType) {
fatalError("Implement updateView")
}
//--------------------------------------------------
@ -58,9 +63,23 @@ open class Control<ModelType: Modelable>: UIControl, ModelHandlerable, ViewProto
public func initialSetup() {
if !initialSetupPerformed {
initialSetupPerformed = true
cancellable = $model.debounce(for: .seconds(Constants.ModelStateDebounce), scheduler: RunLoop.main).sink { [weak self] viewModel in
self?.onStateChange(viewModel: viewModel)
}
//setup shouldUpdate
$model.sink { [weak self] viewModel in
guard let self = self else { return }
let s = self.shouldUpdateView(viewModel: viewModel)
print("shouldUpdate - \(Self.self): \(s)")
self.shouldUpdate = s
}.store(in: &cancellables)
//setup viewUpdate
$model.debounce(for: .seconds(Constants.ModelStateDebounce), scheduler: RunLoop.main).sink { [weak self] viewModel in
guard let self = self else { return }
if self.shouldUpdate {
self.updateView(viewModel: viewModel)
self.shouldUpdate = false
print("didUpdate - \(Self.self)")
}
}.store(in: &cancellables)
setup()
}
}

View File

@ -13,16 +13,21 @@ import Combine
open class View<ModelType: Modelable>: UIView, ModelHandlerable, ViewProtocol, Resettable {
@Published public var model: ModelType
private var cancellable: AnyCancellable?
private var cancellables = Set<AnyCancellable>()
private var shouldUpdate: Bool = false
open func set(with model: ModelType) {
self.model = model
}
open func onStateChange(viewModel: ModelType) {
open func shouldUpdateView(viewModel: ModelType) -> Bool {
fatalError("Implement shouldUpdateView")
}
open func updateView(viewModel: ModelType) {
fatalError("Implement updateView")
}
//--------------------------------------------------
// MARK: - Properties
//--------------------------------------------------
@ -57,9 +62,24 @@ open class View<ModelType: Modelable>: UIView, ModelHandlerable, ViewProtocol, R
public func initialSetup() {
if !initialSetupPerformed {
initialSetupPerformed = true
cancellable = $model.debounce(for: .seconds(Constants.ModelStateDebounce), scheduler: RunLoop.main).sink { [weak self] viewModel in
self?.onStateChange(viewModel: viewModel)
}
//setup shouldUpdate
$model.sink { [weak self] viewModel in
guard let self = self else { return }
let s = self.shouldUpdateView(viewModel: viewModel)
print("shouldUpdate - \(Self.self): \(s)")
self.shouldUpdate = s
}.store(in: &cancellables)
//setup viewUpdate
$model.debounce(for: .seconds(Constants.ModelStateDebounce), scheduler: RunLoop.main).sink { [weak self] viewModel in
guard let self = self else { return }
if self.shouldUpdate {
self.updateView(viewModel: viewModel)
self.shouldUpdate = false
print("didUpdate - \(Self.self)")
}
}.store(in: &cancellables)
setup()
}
}

View File

@ -18,7 +18,8 @@ open class LabelBase<ModelType: LabelModel>: UILabel, ModelHandlerable, Initable
// MARK: - Combine Properties
//--------------------------------------------------
@Published public var model: ModelType
private var cancellable: AnyCancellable?
private var cancellables = Set<AnyCancellable>()
private var shouldUpdate: Bool = false
//--------------------------------------------------
// MARK: - Properties
@ -94,9 +95,23 @@ open class LabelBase<ModelType: LabelModel>: UILabel, ModelHandlerable, Initable
translatesAutoresizingMaskIntoConstraints = false
accessibilityCustomActions = []
accessibilityTraits = .staticText
cancellable = $model.debounce(for: .seconds(Constants.ModelStateDebounce), scheduler: RunLoop.main).sink { [weak self] viewModel in
self?.onStateChange(viewModel: viewModel)
}
//setup shouldUpdate
$model.sink { [weak self] viewModel in
guard let self = self else { return }
self.shouldUpdate = self.shouldUpdateView(viewModel: viewModel)
print("shouldUpdate - \(Self.self): \(self.shouldUpdate)")
}.store(in: &cancellables)
//setup viewUpdate
$model.debounce(for: .seconds(Constants.ModelStateDebounce), scheduler: RunLoop.main).sink { [weak self] viewModel in
guard let self = self else { return }
if self.shouldUpdate {
self.updateView(viewModel: viewModel)
self.shouldUpdate = false
print("didUpdate - \(Self.self)")
}
}.store(in: &cancellables)
}
public func reset() {
@ -120,7 +135,15 @@ open class LabelBase<ModelType: LabelModel>: UILabel, ModelHandlerable, Initable
//--------------------------------------------------
/// Follow the SwiftUI View paradigm
/// - Parameter viewModel: state
open func onStateChange(viewModel: ModelType) {
open func shouldUpdateView(viewModel: ModelType) -> Bool {
return viewModel.text != model.text
|| viewModel.disabled != model.disabled
|| viewModel.surface != model.surface
|| viewModel.font != model.font
|| viewModel.textPosition != model.textPosition
}
open func updateView(viewModel: ModelType) {
textAlignment = viewModel.textPosition.textAlignment
textColor = textColorConfiguration.getColor(viewModel)
@ -146,7 +169,7 @@ open class LabelBase<ModelType: LabelModel>: UILabel, ModelHandlerable, Initable
attribute.setAttribute(on: mutableText)
//see if the attribute is Actionable
if let actionable = attribute as? LabelAttributeActionable{
if let actionable = attribute as? any LabelAttributeActionable{
//create a accessibleAction
let customAccessibilityAction = customAccessibilityAction(range: actionable.range)

View File

@ -300,7 +300,11 @@ open class SelectorBase<ModelType: SelectorModel>: Control<ModelType>, Changable
//--------------------------------------------------
/// Follow the SwiftUI View paradigm
/// - Parameter viewModel: state
open override func onStateChange(viewModel: ModelType) {
open override func shouldUpdateView(viewModel: ModelType) -> Bool {
return true
}
open override func updateView(viewModel: ModelType) {
let enabled = !viewModel.disabled
updateLabels(viewModel)

View File

@ -6,10 +6,13 @@
//
import Foundation
public protocol ModelHandlerable {
associatedtype ModelType: Modelable
var model: ModelType { get set }
init(with model: ModelType)
func set(with model: ModelType)
func shouldUpdateView(viewModel: ModelType) -> Bool
func updateView(viewModel: ModelType)
}