Skip to content

Instantly share code, notes, and snippets.

@moyerr
Last active January 26, 2023 22:16
Show Gist options
  • Save moyerr/f473784ab90c27f83be542e86cd54c4d to your computer and use it in GitHub Desktop.
Save moyerr/f473784ab90c27f83be542e86cd54c4d to your computer and use it in GitHub Desktop.
A UIButton subclass that delivers its press events via an AsyncStream
import UIKit
class AsyncButton: UIButton {
private var continuation: AsyncStream<Void>.Continuation?
private(set) lazy var presses: AsyncStream<Void> = AsyncStream { continuation in
configureContinuation(continuation)
}
deinit { continuation?.finish() }
private func configureContinuation(_ continuation: AsyncStream<Void>.Continuation) {
continuation.onTermination = { [weak self] _ in
Task { @MainActor [weak self] in
self?.continuation = nil
}
}
self.continuation = continuation
addTarget(self, action: #selector(handlePress), for: .touchUpInside)
}
@objc private func handlePress() {
continuation?.yield()
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment