···4343struct ConfigurationView: View {
4444 let bleManager: BLEManager
4545 @State private var settings: [Int: UInt16] = [:]
4646- @State private var isLoading = true
4646+ @State private var isLoading = false
4747 @State private var saveInProgress = false
48484949 var body: some View {
···289289 .task {
290290 await loadSettings()
291291 }
292292+ .onAppear {
293293+ // Pre-populate from cache
294294+ let settingsToLoad: [UInt16] = [0, 1, 2, 6, 7, 11, 13, 14, 17, 22, 24, 25, 26, 27, 28, 33, 34]
295295+ for index in settingsToLoad {
296296+ if let cached = bleManager.settingsCache.get(index) {
297297+ settings[Int(index)] = cached
298298+ }
299299+ }
300300+ }
292301 }
293302294303 private func loadSettings() async {
295295- // Load commonly used settings
304304+ // Load commonly used settings (will use cache if available)
296305 let settingsToLoad: [UInt16] = [0, 1, 2, 6, 7, 11, 13, 14, 17, 22, 24, 25, 26, 27, 28, 33, 34]
297306298298- for index in settingsToLoad {
299299- bleManager.readSetting(index: index) { value in
307307+ isLoading = true
308308+309309+ await withTaskGroup(of: (Int, UInt16?).self) { group in
310310+ for index in settingsToLoad {
311311+ group.addTask { @MainActor in
312312+ await withCheckedContinuation { (continuation: CheckedContinuation<(Int, UInt16?), Never>) in
313313+ bleManager.readSetting(index: index) { value in
314314+ continuation.resume(returning: (Int(index), value))
315315+ }
316316+ }
317317+ }
318318+ }
319319+320320+ for await (index, value) in group {
300321 if let value = value {
301301- settings[Int(index)] = value
322322+ settings[index] = value
302323 }
303324 }
304304- try? await Task.sleep(nanoseconds: 50_000_000) // 50ms between reads
305325 }
306326307327 isLoading = false
+1-1
ios/PinecilTime/TemperatureGraph.swift
···8989 }
90909191 var body: some View {
9292- TimelineView(.animation) { timeline in
9292+ TimelineView(.animation(minimumInterval: 0.1, paused: false)) { timeline in
9393 let now = timeline.date
9494 let windowSeconds: TimeInterval = 6
9595 let xDomain = now.addingTimeInterval(-windowSeconds)...now