// // Modelable.swift // VDS // // Created by Matt Bruce on 7/22/22. // import Foundation import Combine import UIKit public protocol ModelHandlerable: AnyObject, Initable { associatedtype ModelType: Modelable var model: ModelType { get set } var modelPublisher: Published.Publisher { get } var subscribers: Set { get set } init(with model: ModelType) func set(with model: ModelType) func shouldUpdateView(viewModel: ModelType) -> Bool func updateView(viewModel: ModelType) } extension ModelHandlerable { public init() { self.init(with: ModelType()) } public func set(with model: ModelType) { if shouldUpdateView(viewModel: model){ updateView(viewModel: model) self.model = model } } public func setupUpdateView() { handlerPublisher() .subscribe(on: RunLoop.main) .sink { [weak self] viewModel in self?.updateView(viewModel: viewModel) } .store(in: &subscribers) } public func handlerPublisher() -> AnyPublisher { modelPublisher .debounce(for: .seconds(Constants.ModelStateDebounce), scheduler: RunLoop.main) .eraseToAnyPublisher() } }