mirror of
https://github.com/yattee/yattee.git
synced 2026-07-20 14:22:02 +00:00
SwiftUI evaluates a @State default-value autoclosure more than once, keeping only the first instance but still running the side effects of the discarded ones. Each AppEnvironment() built its own DownloadManager, and each DownloadManager registered a background URLSession under the same identifier. The download task started on the surviving instance's session, but iOS delivered the completion delegate callback to the other (leaked) instance, whose activeDownloads was empty - so the finished file was dropped and the progress spinner spun forever at 0 KB. - Make AppEnvironment a process-wide singleton (static let shared) and reference it from the App's @State, guaranteeing exactly one instance (and one background session, one DataManager/CloudKit stack). - Make DownloadManager.setDownloadSettings idempotent: only create the background session when none exists, so a re-entrant call never invalidateAndCancels the live session and kills in-flight downloads. Cellular changes already route through refreshCellularAccessSetting().