Stop the sync poll from rebuilding the panel every 5 s
@Published fires even when the assigned value is unchanged, so the poll's unconditional lastError = nil invalidated PanelView — which observes SyncService — every 5 seconds, forever, hidden or visible. Over five days that was ~185 CPU-minutes and ~190 MB, and clicks started to lag. - Route poll state through setError, which skips equal values. - Watch SyncService from a tiny SyncDot view instead of the panel body. - Skip the URL cache on polls and give them timeouts. - Only reassign the composer placeholder when it changed.
This commit is contained in:
@@ -177,6 +177,14 @@ brew upgrade --cask prompt
|
||||
|
||||
## Gotchas
|
||||
|
||||
- **`@Published` publishes on every assignment, even when the value is
|
||||
unchanged.** The 5-second sync poll used to assign `lastError = nil`
|
||||
unconditionally; `PanelView` observes `SyncService`, so the entire panel
|
||||
(rows, overlays, composer) rebuilt every 5 seconds, forever. Over five days
|
||||
of uptime that was ~185 CPU-minutes and ~190 MB of footprint, and every
|
||||
click started to lag. Poll state now goes through `setError`, which no-ops
|
||||
when equal, and the header's sync dot is its own view so sync publishes
|
||||
cannot invalidate the list.
|
||||
- **Never assign `NSApp.mainMenu`.** SwiftUI installs a menu whose Edit items
|
||||
are how AppKit routes Cmd+C/V/X/A/Z; replacing it with a hand-built menu
|
||||
silently breaks pasting, copying and select-all in the composer (this shipped
|
||||
|
||||
Reference in New Issue
Block a user