Created
March 8, 2021 17:58
-
-
Save lammertw/bbfd3dfeb6b0d391ddd875102c9c5dc7 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
private class ObservableModel<Observed>: ObservableObject { | |
@Published var observed: Observed? | |
init(publisher: AnyPublisher<Observed, Never>) { | |
publisher | |
.compactMap { $0 } | |
.receive(on: DispatchQueue.main) | |
.assign(to: &$observed) | |
} | |
} | |
public struct ObservingView<Observed, Content>: View where Content: View { | |
@ObservedObject private var model: ObservableModel<Observed> | |
private let content: (Observed) -> Content | |
public init(publisher: AnyPublisher<Observed, Never>, @ViewBuilder content: @escaping (Observed) -> Content) { | |
self.model = ObservableModel(publisher: publisher) | |
self.content = content | |
} | |
public var body: some View { | |
let view: AnyView | |
if let observed = self.model.observed { | |
view = AnyView(content(observed)) | |
} else { | |
view = AnyView(EmptyView()) | |
} | |
return view | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment