From f3b29d7f20fffe55d2438d7bd1451fcb0d27811a Mon Sep 17 00:00:00 2001 From: Nikita Vasilev Date: Thu, 27 Nov 2025 15:36:27 +0400 Subject: [PATCH] feat: add debounce to text field input to reduce validation calls --- .../SUI/Managers/FormField/FormField/FormField.swift | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Sources/ValidatorUI/Classes/SUI/Managers/FormField/FormField/FormField.swift b/Sources/ValidatorUI/Classes/SUI/Managers/FormField/FormField/FormField.swift index 9883b24..053bee7 100644 --- a/Sources/ValidatorUI/Classes/SUI/Managers/FormField/FormField/FormField.swift +++ b/Sources/ValidatorUI/Classes/SUI/Managers/FormField/FormField/FormField.swift @@ -30,6 +30,9 @@ public final class FormField: IFormField { /// The rules applied to the value during validation. private let rules: [any IValidationRule] + /// The time the publisher should wait before publishing an element. + private let debounce: TimeInterval + /// The wrapped property value. public var wrappedValue: Value { get { value } @@ -44,14 +47,17 @@ public final class FormField: IFormField { /// - wrappedValue: The initial value of the field. /// - validator: The validator instance to use (defaults to `Validator()`). /// - rules: The array of validation rules to apply to the value. + /// - debounce: The time the publisher should wait before publishing an element. public init( wrappedValue: Value, validator: IValidator = Validator(), - rules: [any IValidationRule] + rules: [any IValidationRule], + debounce: TimeInterval = .zero ) { value = wrappedValue self.validator = validator self.rules = rules + self.debounce = debounce } // MARK: IFormField @@ -66,6 +72,8 @@ public final class FormField: IFormField { let publisher = $value .receive(on: RunLoop.main) + .dropFirst() + .debounce(for: RunLoop.SchedulerTimeType.Stride(debounce), scheduler: RunLoop.main) .handleEvents(receiveOutput: { subject.send($0) }) .map { self.validator.validate(input: $0, rules: self.rules) } .eraseToAnyPublisher()