Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -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))")
}

}
Original file line number Diff line number Diff line change
@@ -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)]")
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -71,5 +71,9 @@ import SwiftUI
func fetchData() async -> Mutation {
return .didFetchData
}

func makeLogger() -> (any ReactorLogger)? {
SampleLogger()
}

}
12 changes: 11 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -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
Expand Down
2 changes: 1 addition & 1 deletion Sources/GoodReactor/MapTables.swift
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ internal enum MapTables {
static let eventStreams = WeakMapTable<AnyReactor, Any>()

// Logger of a reactor
static let loggers = WeakMapTable<AnyReactor, ReactorLogger>()
static let loggers = WeakMapTable<AnyReactor, Optional<ReactorLogger>>()

// Semaphore lock of an event (does not matter which reactor it's running on)
static let eventLocks = WeakMapTable<EventIdentifier, AsyncSemaphore>()
Expand Down
22 changes: 7 additions & 15 deletions Sources/GoodReactor/Reactor.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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
///
Expand All @@ -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.
///
Expand Down Expand Up @@ -235,7 +231,7 @@ public extension Reactor {

typealias Event = GoodReactor.Event<Action, Mutation, Destination>

static var logger: ReactorLogger? {
var logger: ReactorLogger? {
MapTables.loggers.forceCastedValue(forKey: self, default: makeLogger())
}

Expand All @@ -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() {}
Expand Down Expand Up @@ -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: []])
Expand Down Expand Up @@ -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)
}

Expand Down
17 changes: 0 additions & 17 deletions Sources/GoodReactor/ReactorConfiguration.swift

This file was deleted.