diff --git a/GoodReactor-Sample/GoodReactor-Sample.xcodeproj/project.pbxproj b/GoodReactor-Sample/GoodReactor-Sample.xcodeproj/project.pbxproj index cdad473..50334d6 100644 --- a/GoodReactor-Sample/GoodReactor-Sample.xcodeproj/project.pbxproj +++ b/GoodReactor-Sample/GoodReactor-Sample.xcodeproj/project.pbxproj @@ -673,7 +673,7 @@ repositoryURL = "https://github.com/GoodRequest/GoodCoordinator-iOS"; requirement = { kind = upToNextMajorVersion; - minimumVersion = 3.0.4; + minimumVersion = 3.1.0; }; }; /* End XCRemoteSwiftPackageReference section */ diff --git a/GoodReactor-Sample/GoodReactor-Sample.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/GoodReactor-Sample/GoodReactor-Sample.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index ae37706..4fc2d10 100644 --- a/GoodReactor-Sample/GoodReactor-Sample.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/GoodReactor-Sample/GoodReactor-Sample.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -15,8 +15,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/GoodRequest/GoodCoordinator-iOS", "state" : { - "revision" : "09ac74c6d6b17080d09618dee922c6fb76e65d18", - "version" : "3.0.4" + "revision" : "6d66c120f167e860e72f11793ddf3c6226eb8c99", + "version" : "3.1.0" } }, { diff --git a/GoodReactor-Sample/GoodReactor-Sample/Application/AppDelegate.swift b/GoodReactor-Sample/GoodReactor-Sample/Application/AppDelegate.swift index 88866aa..59407e4 100644 --- a/GoodReactor-Sample/GoodReactor-Sample/Application/AppDelegate.swift +++ b/GoodReactor-Sample/GoodReactor-Sample/Application/AppDelegate.swift @@ -22,18 +22,8 @@ class AppDelegate: UIResponder, UIApplicationDelegate { UINavigationBar.configureAppearance() AppCoordinator(window: window).start() - - ReactorConfiguration.logger = SampleLogger() return true } } - -struct SampleLogger: ReactorLogger { - - func logReactorEvent(_ message: Any, level: LogLevel, fileName: String, lineNumber: Int) { - print("[\(level)] \(message) (\(fileName):\(lineNumber))") - } - -} diff --git a/GoodReactor-Sample/goodreactor-swiftui-sample/Logger/SampleLogger.swift b/GoodReactor-Sample/goodreactor-swiftui-sample/Logger/SampleLogger.swift new file mode 100644 index 0000000..9bcee9f --- /dev/null +++ b/GoodReactor-Sample/goodreactor-swiftui-sample/Logger/SampleLogger.swift @@ -0,0 +1,16 @@ +// +// SampleLogger.swift +// goodreactor-swiftui-sample +// +// Created by Matus Klasovity on 23/06/2025. +// + +import GoodReactor + +struct SampleLogger: ReactorLogger { + + func logReactorEvent(_ message: Any, level: GoodReactor.LogLevel, fileName: String, lineNumber: Int) { + print("\(level): \(message) [\(fileName):\(lineNumber)]") + } + +} diff --git a/GoodReactor-Sample/goodreactor-swiftui-sample/Screens/Content/ContentViewModel.swift b/GoodReactor-Sample/goodreactor-swiftui-sample/Screens/Content/ContentViewModel.swift index 9916d2b..46c1b74 100644 --- a/GoodReactor-Sample/goodreactor-swiftui-sample/Screens/Content/ContentViewModel.swift +++ b/GoodReactor-Sample/goodreactor-swiftui-sample/Screens/Content/ContentViewModel.swift @@ -71,5 +71,9 @@ import SwiftUI func fetchData() async -> Mutation { return .didFetchData } + + func makeLogger() -> (any ReactorLogger)? { + SampleLogger() + } } diff --git a/README.md b/README.md index acd48e7..1b23ea7 100644 --- a/README.md +++ b/README.md @@ -181,6 +181,7 @@ reactor.stateStream ## Logging ```swift +// 1. Create a logger conforming to ReactorLogger protocol struct SampleLogger: ReactorLogger { func logReactorEvent(_ message: Any, level: LogLevel, fileName: String, lineNumber: Int) { @@ -189,7 +190,16 @@ struct SampleLogger: ReactorLogger { } -ReactorConfiguration.logger = SampleLogger() +// 2. Set the logger to the Reactor +@Observable final class ContentViewModel: Reactor { + + // ... + + func makeLogger() -> (any ReactorLogger)? { + SampleLogger() + } + +} ``` # License diff --git a/Sources/GoodReactor/MapTables.swift b/Sources/GoodReactor/MapTables.swift index bd3171f..3a43532 100644 --- a/Sources/GoodReactor/MapTables.swift +++ b/Sources/GoodReactor/MapTables.swift @@ -31,7 +31,7 @@ internal enum MapTables { static let eventStreams = WeakMapTable() // Logger of a reactor - static let loggers = WeakMapTable() + static let loggers = WeakMapTable>() // Semaphore lock of an event (does not matter which reactor it's running on) static let eventLocks = WeakMapTable() diff --git a/Sources/GoodReactor/Reactor.swift b/Sources/GoodReactor/Reactor.swift index c762da5..8a7b8ff 100644 --- a/Sources/GoodReactor/Reactor.swift +++ b/Sources/GoodReactor/Reactor.swift @@ -101,7 +101,7 @@ import SwiftUI associatedtype State /// Logger used for logging reactor events - static var logger: ReactorLogger? { get } + var logger: ReactorLogger? { get } /// Initial state of the reactor /// @@ -117,13 +117,9 @@ import SwiftUI /// Constructor for this reactor's logger. Gets called only once during the lifetime /// of a Reactor. - /// - /// Default logger is `OSLogLogger` in iOS 14 and newer, or - /// `PrintLogger` in older iOS versions. - /// - /// - Returns: Logger used for logging reactor events. See `GoodLogger` package + /// - Returns: Logger used for logging reactor events. See `ReactorLogger` protocol /// for more information. - static func makeLogger() -> ReactorLogger? + func makeLogger() -> ReactorLogger? /// Constructor for this reactor's initial state. /// @@ -235,7 +231,7 @@ public extension Reactor { typealias Event = GoodReactor.Event - static var logger: ReactorLogger? { + var logger: ReactorLogger? { MapTables.loggers.forceCastedValue(forKey: self, default: makeLogger()) } @@ -252,8 +248,8 @@ public extension Reactor { MapTables.initialState.forceCastedValue(forKey: self, default: makeInitialState()) } - static func makeLogger() -> ReactorLogger? { - ReactorConfiguration.logger + func makeLogger() -> ReactorLogger? { + nil } func transform() {} @@ -481,7 +477,7 @@ public extension Reactor { _send(event: event) } - Self._debugLog(message: "Subscription finished") + self?._debugLog(message: "Subscription finished") } subscription.store(in: &MapTables.subscriptions[key: self, default: []]) @@ -526,10 +522,6 @@ private extension Reactor { } private func _debugLog(message: String) { - Self._debugLog(message: message) - } - - private static func _debugLog(message: String) { logger?.logReactorEvent("[GoodReactor] \(Self.name) - \(message)", level: .debug, fileName: #file, lineNumber: #line) } diff --git a/Sources/GoodReactor/ReactorConfiguration.swift b/Sources/GoodReactor/ReactorConfiguration.swift deleted file mode 100644 index 553e84c..0000000 --- a/Sources/GoodReactor/ReactorConfiguration.swift +++ /dev/null @@ -1,17 +0,0 @@ -// -// ReactorConfiguration.swift -// GoodReactor -// -// Created by Matus Klasovity on 09/06/2025. -// - -import Foundation - -@MainActor -public struct ReactorConfiguration: Sendable { - - private init() {} - - public static var logger: ReactorLogger? = nil - -}