Skip to content

Commit d063922

Browse files
committed
debounce
1 parent 3bcceb0 commit d063922

File tree

2 files changed

+31
-2
lines changed

2 files changed

+31
-2
lines changed

Sources/EmbraceCore/SwiftUI/EmbraceTraceSurfaceView.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public struct EmbraceTraceSurfaceView<Content: View>: View {
3030

3131
@StateObject
3232
internal var state = SurfaceState()
33-
33+
3434
public init(
3535
_ name: String,
3636
attributes: [String: String]? = nil,
@@ -40,7 +40,7 @@ public struct EmbraceTraceSurfaceView<Content: View>: View {
4040
self.attributes = attributes
4141
self.content = content
4242
}
43-
43+
4444
public var body: some View {
4545
content()
4646
.environment(\.embraceSurfaceParent, state.id)

Sources/EmbraceCore/SwiftUI/Internal/EmbraceSurfaceInternal.swift

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,19 @@ import SwiftUI
99
extension EmbraceTraceSurfaceView {
1010

1111
internal func frameChanged() {
12+
// not sure i want to debounce here.
13+
// debounce causes the updates to wait
14+
// until almost no movement to update
15+
// the top surface which can be a bit late.
16+
/*
17+
state.debounceFrameUpdate {
18+
performFrameUpdatesAfterDebounce()
19+
}
20+
*/
21+
performFrameUpdatesAfterDebounce()
22+
}
23+
24+
private func performFrameUpdatesAfterDebounce() {
1225

1326
let newPercentage: Double
1427
defer {
@@ -57,6 +70,22 @@ extension EmbraceTraceSurfaceView {
5770
var frame: CGRect = .zero
5871
var window: UIWindow? = nil
5972

73+
private var frameUpdateWorkItem: DispatchWorkItem? = nil
74+
75+
deinit {
76+
frameUpdateWorkItem?.cancel()
77+
}
78+
79+
func debounceFrameUpdate(_ action: @escaping () -> Void) {
80+
dispatchPrecondition(condition: .onQueue(.main))
81+
frameUpdateWorkItem?.cancel()
82+
frameUpdateWorkItem = DispatchWorkItem(block: action)
83+
guard let workItem = frameUpdateWorkItem else {
84+
return
85+
}
86+
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1, execute: workItem)
87+
}
88+
6089
var visibleBasedOnAppearance: Bool = false {
6190
didSet { updateVisibility() }
6291
}

0 commit comments

Comments
 (0)