diff --git a/Yattee/Services/Updates/SparkleUpdater.swift b/Yattee/Services/Updates/SparkleUpdater.swift index 5d6272e5..cb66d60a 100644 --- a/Yattee/Services/Updates/SparkleUpdater.swift +++ b/Yattee/Services/Updates/SparkleUpdater.swift @@ -33,12 +33,12 @@ final class AppUpdater { didSet { guard oldValue != wantsBetaChannel else { return } UserDefaults.standard.set(wantsBetaChannel, forKey: Self.wantsBetaKey) - // Trigger re-check so the delegate re-reads channels. Deferred off - // the main thread — resetUpdateCycle may synchronously touch the - // scheduler's feed cache which can stutter SwiftUI scrolling. - let updater = self.updaterController.updater - Task.detached(priority: .utility) { - updater.resetUpdateCycle() + // Trigger re-check so the delegate re-reads channels. Deferred to + // a later main-actor turn so the feed-cache work doesn't run + // synchronously inside this didSet (which can stutter SwiftUI + // scrolling). Must stay on main: SPUUpdater is main-thread-only. + Task { @MainActor in + self.updaterController.updater.resetUpdateCycle() } } }