KVO publisher printing recursively in debugger

38 Views Asked by At

Why does the following LoginDateMonitorView result in hundreds of messages in the debugger?

2022-10-13 06:31:03.959864+0100 Test[4412:126282] [SwiftUI] Publishing changes from within view updates is not allowed, this will cause undefined behavior.

protocol PropertyObserver: ObservableObject {
    associatedtype T: NSObject
    associatedtype Value
    var object: T { get }
    var property: KeyPath<T, Value> { get }
}

extension PropertyObserver {
    
    var objectWillChange: AnyPublisher<Value, Never> {
        object.publisher(for: property).eraseToAnyPublisher()
    }
}

final class User: NSObject {
    @objc dynamic var lastLogin: Date = Date(timeIntervalSince1970: 9)
}

final class UserLoginMonitor: ObservableObject {
    
    let user: User
        
    init(_ user: User) {
        self.user = user
    }
}

extension UserLoginMonitor: PropertyObserver {
    
    var object: User {
        user
    }
    
    var property: KeyPath<User, Date> {
        \.lastLogin
    }
}

struct LoginDateMonitorView: View {
    
    @StateObject private var monitor: UserLoginMonitor
    
    init(user: User) {
        _monitor = StateObject(wrappedValue: UserLoginMonitor(user))
    }
    
    var body: some View {
        VStack {
            Image(systemName: "globe")
                .imageScale(.large)
                .foregroundColor(.accentColor)
            Text("Hello, world!")
        }
        .padding()
    }
}
0

There are 0 best solutions below