From 6ac595e1af682c2a07a1a7ef2c501c8ebc3b50a0 Mon Sep 17 00:00:00 2001 From: Jakub Marek Date: Mon, 28 Jul 2025 15:37:52 +0200 Subject: [PATCH 01/12] Add @MainActor annotations --- .../Scene/___VARIABLE_sceneIdentifier___ComponentModel.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Templates/Scene.xctemplate/Scene/___VARIABLE_sceneIdentifier___ComponentModel.swift b/Templates/Scene.xctemplate/Scene/___VARIABLE_sceneIdentifier___ComponentModel.swift index 6df1470..d22bb7b 100644 --- a/Templates/Scene.xctemplate/Scene/___VARIABLE_sceneIdentifier___ComponentModel.swift +++ b/Templates/Scene.xctemplate/Scene/___VARIABLE_sceneIdentifier___ComponentModel.swift @@ -9,7 +9,7 @@ protocol ___VARIABLE_sceneIdentifier___ComponentModelProtocol: ComponentModel { final class ___VARIABLE_sceneIdentifier___ComponentModel: ___VARIABLE_sceneIdentifier___ComponentModelProtocol { - let onEvent: (Event) -> Void + let onEvent: @MainActor (Event) -> Void private let dataCache: DataCache @@ -35,7 +35,7 @@ extension ___VARIABLE_sceneIdentifier___ComponentModel { final class ___VARIABLE_sceneIdentifier___ComponentModelMock: ___VARIABLE_sceneIdentifier___ComponentModelProtocol { typealias Event = ___VARIABLE_sceneIdentifier___ComponentModel.Event - var onEvent: (Event) -> Void = { _ in } + var onEvent: @MainActor (Event) -> Void = { _ in } func onAppear() async {} } From aa99e19d10cdcc98409097e07f5ec103395fdd18 Mon Sep 17 00:00:00 2001 From: Jakub Marek Date: Mon, 28 Jul 2025 15:39:49 +0200 Subject: [PATCH 02/12] Add @mainactor annotations --- .../___VARIABLE_sceneIdentifier___ComponentModel.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Templates/Scene.xctemplate/Resource Scene/___VARIABLE_sceneIdentifier___ComponentModel.swift b/Templates/Scene.xctemplate/Resource Scene/___VARIABLE_sceneIdentifier___ComponentModel.swift index 59d9a68..d26c0c1 100644 --- a/Templates/Scene.xctemplate/Resource Scene/___VARIABLE_sceneIdentifier___ComponentModel.swift +++ b/Templates/Scene.xctemplate/Resource Scene/___VARIABLE_sceneIdentifier___ComponentModel.swift @@ -9,7 +9,7 @@ protocol ___VARIABLE_sceneIdentifier___ComponentModelProtocol: ComponentModel { final class ___VARIABLE_sceneIdentifier___ComponentModel: ___VARIABLE_sceneIdentifier___ComponentModelProtocol { - let onEvent: (Event) -> Void + let onEvent: @MainActor (Event) -> Void private let dataCache: DataCache private let resource: ___VARIABLE_sceneIdentifier___Resource @@ -38,7 +38,7 @@ extension ___VARIABLE_sceneIdentifier___ComponentModel { final class ___VARIABLE_sceneIdentifier___ComponentModelMock: ___VARIABLE_sceneIdentifier___ComponentModelProtocol { typealias Event = ___VARIABLE_sceneIdentifier___ComponentModel.Event - var onEvent: (Event) -> Void = { _ in } + var onEvent: @MainActor (Event) -> Void = { _ in } func onAppear() async {} } From aac31571bcba953398dd3f2f0634228135e2db45 Mon Sep 17 00:00:00 2001 From: Jakub Marek Date: Mon, 28 Jul 2025 15:41:39 +0200 Subject: [PATCH 03/12] Update ExampleComponentModel.swift --- .../SwiftUI App.xctemplate/ExampleComponentModel.swift | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Templates/SwiftUI App.xctemplate/ExampleComponentModel.swift b/Templates/SwiftUI App.xctemplate/ExampleComponentModel.swift index d9566f8..cc904dc 100644 --- a/Templates/SwiftUI App.xctemplate/ExampleComponentModel.swift +++ b/Templates/SwiftUI App.xctemplate/ExampleComponentModel.swift @@ -9,7 +9,7 @@ protocol ExampleComponentModelProtocol: ComponentModel { final class ExampleComponentModel: ExampleComponentModelProtocol { - let onEvent: (Event) -> Void + let onEvent: @MainActor (Event) -> Void private let dataCache: DataCache @@ -27,7 +27,9 @@ final class ExampleComponentModel: ExampleComponentModelProtocol { } func onTouchUpInside() { - onEvent(.touchEvent) + Task { + await onEvent(.touchEvent) + } } } @@ -41,7 +43,7 @@ extension ExampleComponentModel { final class ExampleComponentModelMock: ExampleComponentModelProtocol { typealias Event = ExampleComponentModel.Event - var onEvent: (Event) -> Void = { _ in } + var onEvent: @MainActor (Event) -> Void = { _ in } func onAppear() async { } From 1ff99903018722c0b28505399fc356180312cb0e Mon Sep 17 00:00:00 2001 From: Jakub Marek Date: Mon, 28 Jul 2025 15:46:28 +0200 Subject: [PATCH 04/12] Update ExampleFlowCoordinator.swift --- .../SwiftUI App.xctemplate/ExampleFlowCoordinator.swift | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Templates/SwiftUI App.xctemplate/ExampleFlowCoordinator.swift b/Templates/SwiftUI App.xctemplate/ExampleFlowCoordinator.swift index 71e713d..721640c 100644 --- a/Templates/SwiftUI App.xctemplate/ExampleFlowCoordinator.swift +++ b/Templates/SwiftUI App.xctemplate/ExampleFlowCoordinator.swift @@ -14,6 +14,7 @@ final class ExampleFlowCoordinator: NavigationStackCoordinator { self.container = container } + @MainActor static func rootView(with instance: ExampleFlowCoordinator) -> some View { NavigationStackFlow(coordinator: instance) { ExampleComponent( @@ -28,7 +29,7 @@ final class ExampleFlowCoordinator: NavigationStackCoordinator { } } - @ViewBuilder + @MainActor @ViewBuilder func scene(for destination: Destination) -> some View { switch destination { case .destination: @@ -39,7 +40,7 @@ final class ExampleFlowCoordinator: NavigationStackCoordinator { extension ExampleFlowCoordinator { @EnumIdentable - enum Destination: Hashable, Identifiable { + enum Destination { case destination } } From 6b6e6c87fbab08b7773349450e53c948a0272c97 Mon Sep 17 00:00:00 2001 From: Jakub Marek Date: Mon, 28 Jul 2025 15:47:19 +0200 Subject: [PATCH 05/12] Update AppCoordinator.swift --- Templates/SwiftUI App.xctemplate/AppCoordinator.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/Templates/SwiftUI App.xctemplate/AppCoordinator.swift b/Templates/SwiftUI App.xctemplate/AppCoordinator.swift index a9eb2c5..d3ad20f 100644 --- a/Templates/SwiftUI App.xctemplate/AppCoordinator.swift +++ b/Templates/SwiftUI App.xctemplate/AppCoordinator.swift @@ -9,6 +9,7 @@ final class AppCoordinator: ObservableObject { self.container = container } + @MainActor var rootView: some View { ExampleFlowCoordinator.rootView( with: ExampleFlowCoordinator(container: container) From ce1cc3b3276508886a43f14c8e6238748b8752f3 Mon Sep 17 00:00:00 2001 From: Jakub Marek Date: Mon, 28 Jul 2025 15:49:57 +0200 Subject: [PATCH 06/12] Update ___VARIABLE_tabCoordinatorIdentifier___TabCoordinator.swift --- ..._VARIABLE_tabCoordinatorIdentifier___TabCoordinator.swift | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Templates/Tab Coordinator.xctemplate/___VARIABLE_tabCoordinatorIdentifier___TabCoordinator.swift b/Templates/Tab Coordinator.xctemplate/___VARIABLE_tabCoordinatorIdentifier___TabCoordinator.swift index d7e963d..6888878 100644 --- a/Templates/Tab Coordinator.xctemplate/___VARIABLE_tabCoordinatorIdentifier___TabCoordinator.swift +++ b/Templates/Tab Coordinator.xctemplate/___VARIABLE_tabCoordinatorIdentifier___TabCoordinator.swift @@ -15,12 +15,13 @@ final class ___VARIABLE_tabCoordinatorIdentifier___TabCoordinator: TabCoordinato @Published var selectedTab: Tab @Published var modalCover: ModalCoverModel? + @MainActor init(container: Container, selectedTab: Tab) { self.container = container self.selectedTab = selectedTab } - @ViewBuilder + @MainActor @ViewBuilder static func rootView(with instance: ___VARIABLE_tabCoordinatorIdentifier___TabCoordinator) -> some View { TabViewFlow(coordinator: instance) { Text("First Tab") @@ -47,7 +48,7 @@ final class ___VARIABLE_tabCoordinatorIdentifier___TabCoordinator: TabCoordinato extension ___VARIABLE_tabCoordinatorIdentifier___TabCoordinator { @EnumIdentable - enum Destination: Hashable, Identifiable { + enum Destination { case destination } } From 41e4f6e68725d816820571aaf747aa90987127c0 Mon Sep 17 00:00:00 2001 From: Jakub Marek Date: Mon, 28 Jul 2025 15:53:01 +0200 Subject: [PATCH 07/12] Update ___VARIABLE_tabCoordinatorIdentifier___TabCoordinator.swift --- .../___VARIABLE_tabCoordinatorIdentifier___TabCoordinator.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Templates/Tab Coordinator.xctemplate/___VARIABLE_tabCoordinatorIdentifier___TabCoordinator.swift b/Templates/Tab Coordinator.xctemplate/___VARIABLE_tabCoordinatorIdentifier___TabCoordinator.swift index 6888878..1c81259 100644 --- a/Templates/Tab Coordinator.xctemplate/___VARIABLE_tabCoordinatorIdentifier___TabCoordinator.swift +++ b/Templates/Tab Coordinator.xctemplate/___VARIABLE_tabCoordinatorIdentifier___TabCoordinator.swift @@ -21,7 +21,7 @@ final class ___VARIABLE_tabCoordinatorIdentifier___TabCoordinator: TabCoordinato self.selectedTab = selectedTab } - @MainActor @ViewBuilder + @ViewBuilder static func rootView(with instance: ___VARIABLE_tabCoordinatorIdentifier___TabCoordinator) -> some View { TabViewFlow(coordinator: instance) { Text("First Tab") From fedda2323083990ccaa6a0e0a3f3e517f13b0e3e Mon Sep 17 00:00:00 2001 From: Jakub Marek Date: Mon, 28 Jul 2025 15:57:38 +0200 Subject: [PATCH 08/12] Update ___VARIABLE_sceneFlowProviderIdentifier___SceneFlowProvider.swift --- ...RIABLE_sceneFlowProviderIdentifier___SceneFlowProvider.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Templates/SceneFlowProvider.xctemplate/___VARIABLE_sceneFlowProviderIdentifier___SceneFlowProvider.swift b/Templates/SceneFlowProvider.xctemplate/___VARIABLE_sceneFlowProviderIdentifier___SceneFlowProvider.swift index 0513b74..b797b38 100644 --- a/Templates/SceneFlowProvider.xctemplate/___VARIABLE_sceneFlowProviderIdentifier___SceneFlowProvider.swift +++ b/Templates/SceneFlowProvider.xctemplate/___VARIABLE_sceneFlowProviderIdentifier___SceneFlowProvider.swift @@ -39,7 +39,7 @@ final class ___VARIABLE_sceneFlowProviderIdentifier___SceneFlowProvider: Coordin extension ___VARIABLE_sceneFlowProviderIdentifier___SceneFlowProvider { @EnumIdentable - enum Destination: Hashable, Identifiable { + enum Destination { case someDestination case otherDestination // Uncomment 'end' case if the coordinator may present additional scenes following those defined by the flow provider. From bc394a984d9a9667ee9ab0932146089ea0d2cd52 Mon Sep 17 00:00:00 2001 From: Jakub Marek Date: Mon, 28 Jul 2025 16:00:30 +0200 Subject: [PATCH 09/12] Update ___VARIABLE_flowCoordinatorIdentifier___FlowCoordinator.swift --- ...__VARIABLE_flowCoordinatorIdentifier___FlowCoordinator.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Templates/Flow Coordinator.xctemplate/___VARIABLE_flowCoordinatorIdentifier___FlowCoordinator.swift b/Templates/Flow Coordinator.xctemplate/___VARIABLE_flowCoordinatorIdentifier___FlowCoordinator.swift index 8f9a9b5..ee3b245 100644 --- a/Templates/Flow Coordinator.xctemplate/___VARIABLE_flowCoordinatorIdentifier___FlowCoordinator.swift +++ b/Templates/Flow Coordinator.xctemplate/___VARIABLE_flowCoordinatorIdentifier___FlowCoordinator.swift @@ -31,7 +31,7 @@ final class ___VARIABLE_flowCoordinatorIdentifier___FlowCoordinator: NavigationS extension ___VARIABLE_flowCoordinatorIdentifier___FlowCoordinator { @EnumIdentable - enum Destination: Hashable, Identifiable { + enum Destination { case destination } } From 07d6395745c41c9574a05dc1aacfb2663e44d344 Mon Sep 17 00:00:00 2001 From: Jakub Marek Date: Mon, 28 Jul 2025 16:02:42 +0200 Subject: [PATCH 10/12] Update ___VARIABLE_sceneFlowProviderIdentifier___SceneFlowProvider.swift --- ...RIABLE_sceneFlowProviderIdentifier___SceneFlowProvider.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Templates/SceneFlowProvider.xctemplate/___VARIABLE_sceneFlowProviderIdentifier___SceneFlowProvider.swift b/Templates/SceneFlowProvider.xctemplate/___VARIABLE_sceneFlowProviderIdentifier___SceneFlowProvider.swift index b797b38..7edbf1d 100644 --- a/Templates/SceneFlowProvider.xctemplate/___VARIABLE_sceneFlowProviderIdentifier___SceneFlowProvider.swift +++ b/Templates/SceneFlowProvider.xctemplate/___VARIABLE_sceneFlowProviderIdentifier___SceneFlowProvider.swift @@ -8,7 +8,7 @@ import SwiftUI final class ___VARIABLE_sceneFlowProviderIdentifier___SceneFlowProvider: CoordinatorSceneFlowProvider { let navigateTo: (Destination) -> Void let pop: () -> Void - let present: ((Destination, ModalCoverModel.Style) -> Void)? = nil + let present: ((Destination, ModalCoverModelStyle) -> Void)? = nil let dismissModal: (() -> Void)? = nil let onModalDismiss: (() -> Void)? = nil let popTo: ((Destination?) -> Void)? = nil From 66e6eb08ce68561fb0c8c787c4993d91de6b92d0 Mon Sep 17 00:00:00 2001 From: Jakub Marek Date: Mon, 28 Jul 2025 16:27:23 +0200 Subject: [PATCH 11/12] Update ExampleComponentModel.swift --- .../SwiftUI App.xctemplate/ExampleComponentModel.swift | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Templates/SwiftUI App.xctemplate/ExampleComponentModel.swift b/Templates/SwiftUI App.xctemplate/ExampleComponentModel.swift index cc904dc..877c57d 100644 --- a/Templates/SwiftUI App.xctemplate/ExampleComponentModel.swift +++ b/Templates/SwiftUI App.xctemplate/ExampleComponentModel.swift @@ -4,7 +4,7 @@ import FuturedArchitecture protocol ExampleComponentModelProtocol: ComponentModel { func onAppear() async - func onTouchUpInside() + @MainActor func onTouchUpInside() } final class ExampleComponentModel: ExampleComponentModelProtocol { @@ -27,9 +27,7 @@ final class ExampleComponentModel: ExampleComponentModelProtocol { } func onTouchUpInside() { - Task { - await onEvent(.touchEvent) - } + onEvent(.touchEvent) } } From fa568374c5b1a23fc7ec8b61bfb0b8982ade46cd Mon Sep 17 00:00:00 2001 From: Jakub Marek Date: Mon, 28 Jul 2025 20:18:56 +0200 Subject: [PATCH 12/12] Update ExampleComponentModel.swift --- Templates/SwiftUI App.xctemplate/ExampleComponentModel.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/Templates/SwiftUI App.xctemplate/ExampleComponentModel.swift b/Templates/SwiftUI App.xctemplate/ExampleComponentModel.swift index 877c57d..0278a1a 100644 --- a/Templates/SwiftUI App.xctemplate/ExampleComponentModel.swift +++ b/Templates/SwiftUI App.xctemplate/ExampleComponentModel.swift @@ -26,6 +26,7 @@ final class ExampleComponentModel: ExampleComponentModelProtocol { // Fetch fresh data } + @MainActor func onTouchUpInside() { onEvent(.touchEvent) }