diff --git a/VDS/Classes/Control.swift b/VDS/Classes/Control.swift index d8a6a6bb..5e4e41d6 100644 --- a/VDS/Classes/Control.swift +++ b/VDS/Classes/Control.swift @@ -16,7 +16,9 @@ open class Control: UIControl, Handlerable, ViewProtocol, Resettable, UserInfoab //-------------------------------------------------- // MARK: - Combine Properties //-------------------------------------------------- - public var subject = PassthroughSubject() + public var delayedSubject = PassthroughSubject() + public var immediateSubject = PassthroughSubject() + public var updateStrategy: HandlerableUpdateStrategy = .immediate /// Set of Subscribers for any Publishers for this Control public var subscribers = Set() @@ -34,10 +36,7 @@ open class Control: UIControl, Handlerable, ViewProtocol, Resettable, UserInfoab // MARK: - Properties //-------------------------------------------------- private var initialSetupPerformed = false - - /// Key of whether or not updateView() is called in setNeedsUpdate() - open var shouldUpdateView: Bool = true - + /// Dictionary for keeping information for this Control use only Primitives open var userInfo = [String: Primitive]() @@ -141,6 +140,13 @@ open class Control: UIControl, Handlerable, ViewProtocol, Resettable, UserInfoab //-------------------------------------------------- // MARK: - Overrides //-------------------------------------------------- + open override func didMoveToWindow() { + super.didMoveToWindow() + if window != nil { + print("sss - \(Self.self) changed to delayed update strategy") + updateStrategy = .delayed + } + } /// Update this view based off of property changes open func updateView() { diff --git a/VDS/Classes/SelectorItemBase.swift b/VDS/Classes/SelectorItemBase.swift index 966b4d9c..e659a3cb 100644 --- a/VDS/Classes/SelectorItemBase.swift +++ b/VDS/Classes/SelectorItemBase.swift @@ -228,7 +228,6 @@ open class SelectorItemBase: Control, Errorable, open override func reset() { super.reset() - shouldUpdateView = false label.reset() childLabel.reset() errorLabel.reset() @@ -249,7 +248,6 @@ open class SelectorItemBase: Control, Errorable, value = nil isSelected = false - shouldUpdateView = true setNeedsUpdate() } diff --git a/VDS/Classes/View.swift b/VDS/Classes/View.swift index e6e37aad..f9b763fd 100644 --- a/VDS/Classes/View.swift +++ b/VDS/Classes/View.swift @@ -17,17 +17,17 @@ open class View: UIView, Handlerable, ViewProtocol, Resettable, UserInfoable { //-------------------------------------------------- // MARK: - Combine Properties //-------------------------------------------------- - public var subject = PassthroughSubject() + public var delayedSubject = PassthroughSubject() + public var immediateSubject = PassthroughSubject() + public var updateStrategy: HandlerableUpdateStrategy = .immediate + public var subscribers = Set() //-------------------------------------------------- // MARK: - Properties //-------------------------------------------------- private var initialSetupPerformed = false - - /// Key of whether or not updateView() is called in setNeedsUpdate() - open var shouldUpdateView: Bool = true - + /// Dictionary for keeping information for this Control use only Primitives open var userInfo = [String: Primitive]() @@ -72,6 +72,12 @@ open class View: UIView, Handlerable, ViewProtocol, Resettable, UserInfoable { //-------------------------------------------------- // MARK: - Overrides //-------------------------------------------------- + open override func didMoveToWindow() { + super.didMoveToWindow() + if window != nil { + updateStrategy = .delayed + } + } /// Update this view based off of property changes open func updateView() { diff --git a/VDS/Protocols/Handlerable.swift b/VDS/Protocols/Handlerable.swift index 856542b1..cf3f841f 100644 --- a/VDS/Protocols/Handlerable.swift +++ b/VDS/Protocols/Handlerable.swift @@ -9,32 +9,39 @@ import Foundation import Combine import UIKit +public enum HandlerableUpdateStrategy { + case immediate + case delayed +} + public protocol Handlerable: AnyObject, Initable, Disabling, Surfaceable { - var subject: PassthroughSubject { get set } + var delayedSubject: PassthroughSubject { get set } + var immediateSubject: PassthroughSubject { get set } var subscribers: Set { get set } - var shouldUpdateView: Bool { get set } + var updateStrategy: HandlerableUpdateStrategy { get set } func updateView() } extension Handlerable { public func setupNeedsUpdateEvent() { - handlerPublisher().sink { [weak self] _ in + delayedSubject + .debounce(for: .seconds(0), scheduler: RunLoop.main) + .sink { [weak self] _ in + self?.updateView() + }.store(in: &subscribers) + + immediateSubject + .sink { [weak self] _ in self?.updateView() }.store(in: &subscribers) } - public func handlerPublisher() -> AnyPublisher { - subject - .eraseToAnyPublisher() - .debounce(for: .milliseconds(50), scheduler: RunLoop.main) - .eraseToAnyPublisher() - } - public func setNeedsUpdate() { - if shouldUpdateView { - shouldUpdateView = false - updateView() - shouldUpdateView = true + switch updateStrategy { + case .delayed: + delayedSubject.send() + case .immediate: + immediateSubject.send() } } }