refactored handlerPublisher()
Signed-off-by: Matt Bruce <matt.bruce@verizon.com>
This commit is contained in:
parent
8217e08182
commit
2a53bae78c
@ -59,7 +59,6 @@
|
|||||||
EAB1D29E28A5619500DAE764 /* RadioButtonGroupModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAB1D29D28A5619500DAE764 /* RadioButtonGroupModel.swift */; };
|
EAB1D29E28A5619500DAE764 /* RadioButtonGroupModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAB1D29D28A5619500DAE764 /* RadioButtonGroupModel.swift */; };
|
||||||
EAB1D2A128A598FE00DAE764 /* UsesAutoLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAB1D2A028A598FE00DAE764 /* UsesAutoLayout.swift */; };
|
EAB1D2A128A598FE00DAE764 /* UsesAutoLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAB1D2A028A598FE00DAE764 /* UsesAutoLayout.swift */; };
|
||||||
EAB1D2A328A5994800DAE764 /* Debuggable.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAB1D2A228A5994800DAE764 /* Debuggable.swift */; };
|
EAB1D2A328A5994800DAE764 /* Debuggable.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAB1D2A228A5994800DAE764 /* Debuggable.swift */; };
|
||||||
EAB1D2C728A6E76300DAE764 /* ModelHandlerPublisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAB1D2C628A6E76300DAE764 /* ModelHandlerPublisher.swift */; };
|
|
||||||
EAB1D2CD28ABE76100DAE764 /* Withable.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAB1D2CC28ABE76000DAE764 /* Withable.swift */; };
|
EAB1D2CD28ABE76100DAE764 /* Withable.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAB1D2CC28ABE76000DAE764 /* Withable.swift */; };
|
||||||
EAB1D2CF28ABEF2B00DAE764 /* Typography.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAB1D2CE28ABEF2B00DAE764 /* Typography.swift */; };
|
EAB1D2CF28ABEF2B00DAE764 /* Typography.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAB1D2CE28ABEF2B00DAE764 /* Typography.swift */; };
|
||||||
EAB1D2E628AE842000DAE764 /* Publisher+Bind.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAB1D2E328AE842000DAE764 /* Publisher+Bind.swift */; };
|
EAB1D2E628AE842000DAE764 /* Publisher+Bind.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAB1D2E328AE842000DAE764 /* Publisher+Bind.swift */; };
|
||||||
@ -157,7 +156,6 @@
|
|||||||
EAB1D29D28A5619500DAE764 /* RadioButtonGroupModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RadioButtonGroupModel.swift; sourceTree = "<group>"; };
|
EAB1D29D28A5619500DAE764 /* RadioButtonGroupModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RadioButtonGroupModel.swift; sourceTree = "<group>"; };
|
||||||
EAB1D2A028A598FE00DAE764 /* UsesAutoLayout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UsesAutoLayout.swift; sourceTree = "<group>"; };
|
EAB1D2A028A598FE00DAE764 /* UsesAutoLayout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UsesAutoLayout.swift; sourceTree = "<group>"; };
|
||||||
EAB1D2A228A5994800DAE764 /* Debuggable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Debuggable.swift; sourceTree = "<group>"; };
|
EAB1D2A228A5994800DAE764 /* Debuggable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Debuggable.swift; sourceTree = "<group>"; };
|
||||||
EAB1D2C628A6E76300DAE764 /* ModelHandlerPublisher.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ModelHandlerPublisher.swift; sourceTree = "<group>"; };
|
|
||||||
EAB1D2CC28ABE76000DAE764 /* Withable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Withable.swift; sourceTree = "<group>"; };
|
EAB1D2CC28ABE76000DAE764 /* Withable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Withable.swift; sourceTree = "<group>"; };
|
||||||
EAB1D2CE28ABEF2B00DAE764 /* Typography.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Typography.swift; sourceTree = "<group>"; };
|
EAB1D2CE28ABEF2B00DAE764 /* Typography.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Typography.swift; sourceTree = "<group>"; };
|
||||||
EAB1D2E328AE842000DAE764 /* Publisher+Bind.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Publisher+Bind.swift"; sourceTree = "<group>"; };
|
EAB1D2E328AE842000DAE764 /* Publisher+Bind.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Publisher+Bind.swift"; sourceTree = "<group>"; };
|
||||||
@ -434,7 +432,6 @@
|
|||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
EAB1D2E328AE842000DAE764 /* Publisher+Bind.swift */,
|
EAB1D2E328AE842000DAE764 /* Publisher+Bind.swift */,
|
||||||
EAB1D2C628A6E76300DAE764 /* ModelHandlerPublisher.swift */,
|
|
||||||
EA89200128AECF2A006B9984 /* UIButton+Publisher.swift */,
|
EA89200128AECF2A006B9984 /* UIButton+Publisher.swift */,
|
||||||
EAB1D2E928AE84AA00DAE764 /* UIControlPublisher.swift */,
|
EAB1D2E928AE84AA00DAE764 /* UIControlPublisher.swift */,
|
||||||
EA89200328AECF4B006B9984 /* UITextField+Publisher.swift */,
|
EA89200328AECF4B006B9984 /* UITextField+Publisher.swift */,
|
||||||
@ -646,7 +643,6 @@
|
|||||||
EA336171288B19200071C351 /* VDS.docc in Sources */,
|
EA336171288B19200071C351 /* VDS.docc in Sources */,
|
||||||
EAF7F0962899861000B287F5 /* CheckboxModel.swift in Sources */,
|
EAF7F0962899861000B287F5 /* CheckboxModel.swift in Sources */,
|
||||||
EAB1D2E628AE842000DAE764 /* Publisher+Bind.swift in Sources */,
|
EAB1D2E628AE842000DAE764 /* Publisher+Bind.swift in Sources */,
|
||||||
EAB1D2C728A6E76300DAE764 /* ModelHandlerPublisher.swift in Sources */,
|
|
||||||
EA3361AA288B25E40071C351 /* Disabling.swift in Sources */,
|
EA3361AA288B25E40071C351 /* Disabling.swift in Sources */,
|
||||||
EA89200828B526E0006B9984 /* CheckboxGroupModel.swift in Sources */,
|
EA89200828B526E0006B9984 /* CheckboxGroupModel.swift in Sources */,
|
||||||
EA3361B6288B2A410071C351 /* Control.swift in Sources */,
|
EA3361B6288B2A410071C351 /* Control.swift in Sources */,
|
||||||
|
|||||||
@ -33,12 +33,17 @@ extension ModelHandlerable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public func setupUpdateView() {
|
public func setupUpdateView() {
|
||||||
modelPublisher
|
handlerPublisher()
|
||||||
.debounce(for: .seconds(Constants.ModelStateDebounce), scheduler: RunLoop.main)
|
|
||||||
.subscribe(on: RunLoop.main)
|
.subscribe(on: RunLoop.main)
|
||||||
.sink { [weak self] viewModel in
|
.sink { [weak self] viewModel in
|
||||||
self?.updateView(viewModel: viewModel)
|
self?.updateView(viewModel: viewModel)
|
||||||
}
|
}
|
||||||
.store(in: &subscribers)
|
.store(in: &subscribers)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public func handlerPublisher() -> AnyPublisher<ModelType, Never> {
|
||||||
|
modelPublisher
|
||||||
|
.debounce(for: .seconds(Constants.ModelStateDebounce), scheduler: RunLoop.main)
|
||||||
|
.eraseToAnyPublisher()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,70 +0,0 @@
|
|||||||
//
|
|
||||||
// ModelHanlderPublisher.swift
|
|
||||||
// VDS
|
|
||||||
//
|
|
||||||
// Created by Matt Bruce on 8/12/22.
|
|
||||||
//
|
|
||||||
|
|
||||||
import Foundation
|
|
||||||
import Combine
|
|
||||||
|
|
||||||
extension Publishers {
|
|
||||||
public struct ModelHandlerPublisher<ModelHandlerType: ModelHandlerable>: Publisher {
|
|
||||||
|
|
||||||
public typealias Output = ModelHandlerType.ModelType
|
|
||||||
public typealias Failure = Never
|
|
||||||
|
|
||||||
private let modelHandler: ModelHandlerType
|
|
||||||
|
|
||||||
public init(modelHandler: ModelHandlerType) { self.modelHandler = modelHandler }
|
|
||||||
|
|
||||||
public func receive<S>(subscriber: S) where S : Subscriber, Never == S.Failure, ModelHandlerType.ModelType == S.Input {
|
|
||||||
let subscription = ModelHandlerSubscription(subscriber: subscriber, modelHandler: modelHandler)
|
|
||||||
subscriber.receive(subscription: subscription)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class ModelHandlerSubscription<S: Subscriber, ModelHandlerType: ModelHandlerable>: Subscription where S.Input == ModelHandlerType.ModelType, S.Failure == Never {
|
|
||||||
|
|
||||||
private var subscriber: S?
|
|
||||||
private var modelHandler: ModelHandlerType?
|
|
||||||
public var subscribers = Set<AnyCancellable>()
|
|
||||||
public init(subscriber: S, modelHandler: ModelHandlerType) {
|
|
||||||
self.subscriber = subscriber
|
|
||||||
self.modelHandler = modelHandler
|
|
||||||
subscribe()
|
|
||||||
}
|
|
||||||
|
|
||||||
public func request(_ demand: Subscribers.Demand) { }
|
|
||||||
|
|
||||||
public func cancel() {
|
|
||||||
subscriber = nil
|
|
||||||
modelHandler = nil
|
|
||||||
}
|
|
||||||
|
|
||||||
private func subscribe() {
|
|
||||||
guard let publisher = modelHandler?.modelPublisher else { return }
|
|
||||||
|
|
||||||
publisher
|
|
||||||
.debounce(for: .seconds(Constants.ModelStateDebounce), scheduler: RunLoop.main)
|
|
||||||
.sink { [weak self] viewModel in
|
|
||||||
_ = self?.subscriber?.receive(viewModel)
|
|
||||||
}
|
|
||||||
.store(in: &subscribers)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
extension ModelHandlerable {
|
|
||||||
public func handlerPublisher() -> AnyPublisher<ModelType, Never> {
|
|
||||||
return Publishers.ModelHandlerPublisher(modelHandler: self).eraseToAnyPublisher()
|
|
||||||
}
|
|
||||||
|
|
||||||
public func createBinding(with subject: CurrentValueSubject<ModelType, Never>, storeIn subscriptions: inout Set<AnyCancellable>) {
|
|
||||||
handlerPublisher()
|
|
||||||
.sink { (value) in
|
|
||||||
subject.send(value)
|
|
||||||
}
|
|
||||||
.store(in: &subscriptions)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Loading…
Reference in New Issue
Block a user