AsyncLoadableStream
Listen to an AsyncLoadable by using an AsyncStream. This allows you to iterate over the
iterator, this will stream a new AsyncLoadableStreamObject on every
change in the loadable.
For example:
class MyView: UIView {
private let loadable: AsyncLoadable<MyData>
// It's crucial that we call `finish()` somehow, this is also called upon deinit,
// so storing it as a property is an easy way to accomplish this.
private var stream: AsyncLoadableStream<MyData>?
public init(loadable: AsyncLoadable<MyData>) {
let stream = AsyncLoadableStream(loadable)
self.loadable = loadable
self.stream = stream
for await obj in stream.iterator {
// Do something with the stream object, e.g. update UI.
updateUI()
}
}
private func updateUI() {
loader.isHidden = loadable.loadableState != .syncing
}
}
Please note that due to the nature of async/await in swift it’s crucial to store the stream as a local (private) property
to ensure that finish() get’s called upon deinit. This stops the stream.
Otherwise your Actor will get blocked indefinitely, since it will keep on waiting for new values, causing a memory leak.
-
The iterator to loop over, e.g. using a
for await val in stream.iterator { .... -
Initialise a new stream.
-
Finish the stream, this stops the
for awaitloop. This is required to call somewhere, either bydeinit(via a stored property) or manually.
View on GitHub
AsyncLoadableStream Class Reference