Skip to content

Instantly share code, notes, and snippets.

@lammertw
Created March 8, 2021 17:58
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lammertw/bbfd3dfeb6b0d391ddd875102c9c5dc7 to your computer and use it in GitHub Desktop.
Save lammertw/bbfd3dfeb6b0d391ddd875102c9c5dc7 to your computer and use it in GitHub Desktop.
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