Update: Made a small extention that so far looks to be handling it. Not thoroughly tested though, so might need some rework. But the general idea is
Extend ObservableObject
language
class PausableObservableObject: ObservableObject {
private var isPaused: Bool = false
private var hasPendingUpdates = false
var onResume: (() - ())? = nil
func publishWillUpdate() {
if (!isPaused) {
self.objectWillChange.send()
} else {
hasPendingUpdates = true
}
}
func pause() {
isPaused = true
}
func resume() {
isPaused = false
if hasPendingUpdates {
hasPendingUpdates = false
self.objectWillChange.send()
}
onResume?()
}
}
And make a viewModifier that is visibility aware:
language
struct VisibilityAwareObservables: ViewModifier {
let observables: [PausableObservableObject]
func body(content: Content) - some View {
AnyView(content)
.onAppear {
for observable in observables {
observable.resume()
}
}
.onDisappear {
for observable in observables {
observable.pause()
}
}
}
}
extension View {
func visibilityAwareObservables(observables: [PausableObservableObject]) - some View {
ModifiedContent(content: self, modifier: VisibilityAwareObservables(observables: observables))
}
}
Now make your observableObject an instance of PausableObservableObject and make sure that whenever data to be published is changed, you call
language
publishWillUpdate()
and simply pass this object along with any other PausableObservableObject into the viewModifier visibilityAwareObservables
Example:
language
struct ExampleView: View {
@ObservedObject var datasource = MyDatasourceObservable()
/* MyDatasourceObservable extends PausableObservableObject */
var body: some View {
VStack(alignment: .leading, spacing: 8) {
Text(datasource.somePublishedParameter)
}
.visibilityAwareObservables(observables: [datasource])
}
}
Topic:
UI Frameworks
SubTopic:
SwiftUI
Tags: