-
-
Save BigZaphod/874a9458c3fc5f546ea1e2b186118cc3 to your computer and use it in GitHub Desktop.
final actor Worker: ObservableObject { | |
@MainActor @Published private(set) var lastWorkDoneAt: Date? | |
private var counter = 0 | |
func doWork() { | |
counter += 1 | |
DispatchQueue.main.async { | |
self.lastWorkDoneAt = .now | |
} | |
} | |
func fetchWorkCounter() -> Int { | |
return counter | |
} | |
} | |
struct MyTestView: View { | |
@StateObject private var worker = Worker() | |
@State private var queuedWorkCount: Int = 0 | |
@State private var fetchedWorkCount: Int = 0 | |
var body: some View { | |
VStack { | |
Text("Queued Work Count: \(queuedWorkCount)") | |
Text("Fetched Work Count: \(fetchedWorkCount)") | |
Divider() | |
Button { | |
Task { | |
for i in 1...100 { | |
queuedWorkCount += 1 | |
await worker.doWork() | |
} | |
} | |
} label: { | |
Text("Enqueue 100 Work") | |
} | |
} | |
.task(id: worker.lastWorkDoneAt) { | |
fetchedWorkCount = await worker.fetchWorkCounter() | |
} | |
} | |
} |
That's not the same as what I am going for, I think. The real Worker actor is managing a database, so I was looking for a way to generate an event that basically just means, "some data has changed, you need to re-run your query and update your UI."
So somewhere else in the app, a record may be added to the worker actor with something like: await worker.save(record)
- possibly even as a background process or something triggered by a timer somewhere. After the record is actually been saved, I wanted to trigger a signal so UI elsewhere in the app can re-query their view and see the changes. Of course it's not as perfectly efficient as noting exactly what changed and only updating exactly those objects and views or whatever, but I figured this would be close enough. I think the idea would work okay except I ran into this.
Would an approach more like this work, where you publish the completed work and use that directly in the view?