Created
March 8, 2024 15:53
-
-
Save BigZaphod/874a9458c3fc5f546ea1e2b186118cc3 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
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() | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.