Last active
June 1, 2021 03:14
-
-
Save adellibovi/db4fefdcb449cb4355bb54c9a47141fc to your computer and use it in GitHub Desktop.
Swift Combine's Publisher for CADisplayLink
This file contains hidden or 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
import Combine | |
import QuartzCore.CADisplayLink | |
extension CADisplayLink { | |
fileprivate class DisplayLinkWrapper { | |
private var subscriber: AnySubscriber<CADisplayLink, Never> | |
private var displayLink: CADisplayLink? | |
init(runloop: RunLoop, mode: RunLoop.Mode, subscriber: AnySubscriber<CADisplayLink, Never>) { | |
self.subscriber = subscriber | |
self.displayLink = CADisplayLink(target: self, selector: #selector(displayLinkHandler)) | |
self.displayLink?.add(to: runloop, forMode: mode) | |
} | |
@objc func displayLinkHandler(displayLink: CADisplayLink) { | |
_ = subscriber.receive(displayLink) | |
} | |
deinit { | |
displayLink?.invalidate() | |
} | |
} | |
static func publisher(to runloop: RunLoop, forMode mode: RunLoop.Mode) -> AnyPublisher<CADisplayLink, Never> { | |
return Publishers.Deferred<AnyPublisher<CADisplayLink, Never>> { | |
var displayLinkWrapper: DisplayLinkWrapper? | |
return AnyPublisher { subscriber in | |
displayLinkWrapper = DisplayLinkWrapper(runloop: runloop, mode: mode, subscriber: subscriber) | |
} | |
.handleEvents(receiveCancel: { | |
if displayLinkWrapper != nil { | |
displayLinkWrapper = nil | |
} | |
}).eraseToAnyPublisher() | |
}.eraseToAnyPublisher() | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment