Close Menu
  • Home
  • AI
  • Big Data
  • Cloud Computing
  • iOS Development
  • IoT
  • IT/ Cybersecurity
  • Tech
    • Nanotechnology
    • Green Technology
    • Apple
    • Software Development
    • Software Engineering

Subscribe to Updates

Get the latest technology news from Bigteetechhub about IT, Cybersecurity and Big Data.

    What's Hot

    Chinese Buses, European Fears, and the Truth About Connected Fleets

    November 11, 2025

    Google’s Plan to Fix a Broken System

    November 11, 2025

    swift – IOS app not opened or prompted to open when Universal Link used

    November 10, 2025
    Facebook X (Twitter) Instagram
    Facebook X (Twitter) Instagram
    Big Tee Tech Hub
    • Home
    • AI
    • Big Data
    • Cloud Computing
    • iOS Development
    • IoT
    • IT/ Cybersecurity
    • Tech
      • Nanotechnology
      • Green Technology
      • Apple
      • Software Development
      • Software Engineering
    Big Tee Tech Hub
    Home»iOS Development»ios – How to define onTapGesture with debounce in SwiftUI using PassThroughSubject simpler way than modifier, ViewModifier and Model inside?
    iOS Development

    ios – How to define onTapGesture with debounce in SwiftUI using PassThroughSubject simpler way than modifier, ViewModifier and Model inside?

    big tee tech hubBy big tee tech hubAugust 12, 2025002 Mins Read
    Share Facebook Twitter Pinterest Copy Link LinkedIn Tumblr Email Telegram WhatsApp
    Follow Us
    Google News Flipboard
    ios – How to define onTapGesture with debounce in SwiftUI using PassThroughSubject simpler way than modifier, ViewModifier and Model inside?
    Share
    Facebook Twitter LinkedIn Pinterest Email Copy Link


    A debounce operation can be implemented by waiting inside a task(id:). Change the id parameter in onTapGesture to start a new task. If another tap occurs during the Task.sleep call, the task will be cancelled and so Task.sleep will throw an error.

    struct DebounceTapModifier: ViewModifier {
        private let action: () -> Void
        private let debounce: CGFloat
        
        @State private var taskTrigger: Bool?
        
        init(action: @escaping () -> Void, debounce: CGFloat) {
            self.action = action
            self.debounce = debounce
        }
        
        func body(content: Content) -> some View {
            content
                .onTapGesture {
                    taskTrigger = !(taskTrigger ?? false)
                }
                .task(id: taskTrigger) {
                    guard taskTrigger != nil { return } // the user has not tapped yet
                    do {
                        try await Task.sleep(for: .seconds(debounce))
                        // if Task.sleep throws an error, action will not be called
                        action()
                    } catch {
                        // another tap occurred during the debounce duration
                    }
                }
        }
    }
    

    As for your Combine approach, the lifetime of DebounceViewModel is not being managed by SwiftUI. I would make it an ObservableObject and put it in a @StateObject, so that its lifetime is the same as the view modifier.

    class Debouncer: ObservableObject {
        var cancellable: (any Cancellable)?
        let subject = PassthroughSubject()
        
        deinit {
            print("deinit")
        }
    }
    
    struct DebounceTapModifier: ViewModifier {
        private let action: () -> Void
        private let debounce: CGFloat
        private var debouncer = Debouncer()
        
        init(action: @escaping () -> Void, debounce: CGFloat) {
            self.action = action
            self.debounce = debounce
        }
        
        func body(content: Content) -> some View {
            content
                .onTapGesture {
                    debouncer.subject.send(0)
                }
                .onChange(of: debounce) {
                    // redo the publisher subscription if the debounce time has changed
                    // if debounce is always the same then you can just do this in onAppear
                    setupActions()
    
                     // *do not* call setupActions in the initialiser. The StateObject has not yet been "installed" at that time.
                }
        }
        
        private func setupActions() {
            debouncer.cancellable = debouncer.subject
                .debounce(for: .seconds(debounce), scheduler: DispatchQueue.main)
                .sink { _ in
                    action()
                }
        }
    }
    



    Source link

    debounce define iOS model modifier onTapGesture PassThroughSubject simpler SwiftUI ViewModifier
    Follow on Google News Follow on Flipboard
    Share. Facebook Twitter Pinterest LinkedIn Tumblr Email Copy Link
    tonirufai
    big tee tech hub
    • Website

    Related Posts

    swift – IOS app not opened or prompted to open when Universal Link used

    November 10, 2025

    android – MissingPluginException(No implementation found for method OneSignal#initialize on channel OneSignal

    November 9, 2025

    How to access and modify Swift class properties using Frida on iOS?

    November 8, 2025
    Add A Comment
    Leave A Reply Cancel Reply

    Editors Picks

    Chinese Buses, European Fears, and the Truth About Connected Fleets

    November 11, 2025

    Google’s Plan to Fix a Broken System

    November 11, 2025

    swift – IOS app not opened or prompted to open when Universal Link used

    November 10, 2025

    A new era and new features in Azure Ultra Disk

    November 10, 2025
    About Us
    About Us

    Welcome To big tee tech hub. Big tee tech hub is a Professional seo tools Platform. Here we will provide you only interesting content, which you will like very much. We’re dedicated to providing you the best of seo tools, with a focus on dependability and tools. We’re working to turn our passion for seo tools into a booming online website. We hope you enjoy our seo tools as much as we enjoy offering them to you.

    Don't Miss!

    Chinese Buses, European Fears, and the Truth About Connected Fleets

    November 11, 2025

    Google’s Plan to Fix a Broken System

    November 11, 2025

    Subscribe to Updates

    Get the latest technology news from Bigteetechhub about IT, Cybersecurity and Big Data.

      • About Us
      • Contact Us
      • Disclaimer
      • Privacy Policy
      • Terms and Conditions
      © 2025 bigteetechhub.All Right Reserved

      Type above and press Enter to search. Press Esc to cancel.