From 0e990d29d31472cda147c9b60e59d3157ab176f7 Mon Sep 17 00:00:00 2001 From: Jamil Date: Sun, 9 Feb 2025 19:53:22 -0800 Subject: [PATCH] refactor(apple): Annotate update resources callback @MainActor (#8069) Followup to the discussion on https://github.com/firezone/firezone/pull/8064. By annotating the callback that updates our Resources `@MainActor`, the compiler will correctly warn us when we call it from a non-isolated context. --- .../FirezoneKit/Managers/VPNConfigurationManager.swift | 4 ++-- .../apple/FirezoneKit/Sources/FirezoneKit/Stores/Store.swift | 2 +- .../FirezoneKit/Sources/FirezoneKit/Views/SessionView.swift | 1 - 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/swift/apple/FirezoneKit/Sources/FirezoneKit/Managers/VPNConfigurationManager.swift b/swift/apple/FirezoneKit/Sources/FirezoneKit/Managers/VPNConfigurationManager.swift index 103bfab39..ae25cc80b 100644 --- a/swift/apple/FirezoneKit/Sources/FirezoneKit/Managers/VPNConfigurationManager.swift +++ b/swift/apple/FirezoneKit/Sources/FirezoneKit/Managers/VPNConfigurationManager.swift @@ -320,7 +320,7 @@ public class VPNConfigurationManager { updateInternetResourceState() } - func fetchResources(callback: @escaping (ResourceList) -> Void) { + func fetchResources(callback: @escaping @MainActor (ResourceList) -> Void) { guard session()?.status == .connected else { return } do { @@ -338,7 +338,7 @@ public class VPNConfigurationManager { self.resourcesListCache = ResourceList.loaded(decoded) } - callback(self.resourcesListCache) + Task { await MainActor.run { callback(self.resourcesListCache) } } } } catch { Log.error(error) diff --git a/swift/apple/FirezoneKit/Sources/FirezoneKit/Stores/Store.swift b/swift/apple/FirezoneKit/Sources/FirezoneKit/Stores/Store.swift index 7bfe1ea08..0a79c04b2 100644 --- a/swift/apple/FirezoneKit/Sources/FirezoneKit/Stores/Store.swift +++ b/swift/apple/FirezoneKit/Sources/FirezoneKit/Stores/Store.swift @@ -160,7 +160,7 @@ public final class Store: ObservableObject { // Network Extensions don't have a 2-way binding up to the GUI process, // so we need to periodically ask the tunnel process for them. - func beginUpdatingResources(callback: @escaping (ResourceList) -> Void) { + func beginUpdatingResources(callback: @escaping @MainActor (ResourceList) -> Void) { Log.log("\(#function)") if self.resourcesTimer != nil { diff --git a/swift/apple/FirezoneKit/Sources/FirezoneKit/Views/SessionView.swift b/swift/apple/FirezoneKit/Sources/FirezoneKit/Views/SessionView.swift index ed7acaaa7..564fd41f2 100644 --- a/swift/apple/FirezoneKit/Sources/FirezoneKit/Views/SessionView.swift +++ b/swift/apple/FirezoneKit/Sources/FirezoneKit/Views/SessionView.swift @@ -63,7 +63,6 @@ public final class SessionViewModel: ObservableObject { public func isInternetResourceEnabled() -> Bool { store.internetResourceEnabled() } - } #if os(iOS)