Skip to content

Instantly share code, notes, and snippets.

@aleclarson
Last active August 21, 2019 08:34
Show Gist options
  • Save aleclarson/e3ac0afce979eea429eb to your computer and use it in GitHub Desktop.
Save aleclarson/e3ac0afce979eea429eb to your computer and use it in GitHub Desktop.
A block-based CADisplayLink for Swift
@romdevios
Copy link

romdevios commented Aug 21, 2019

Swift 5

public class DisplayLink {
    
    public init (_ callback: @escaping () -> Void) {
        _callback = callback
        _link = CADisplayLink(target: _DisplayTarget(self), selector: #selector(_DisplayTarget._callback))
        _link.add(to: RunLoop.main, forMode: RunLoop.Mode.common)
    }
    
    fileprivate let _callback: () -> Void
    
    private var _link: CADisplayLink!
    
    deinit {
        _link.invalidate()
    }

    func pause() {
        _link.isPaused = true
    }
    func resume() {
        _link.isPaused = false
    }
}

/// Retained by CADisplayLink.
fileprivate class _DisplayTarget {
    
    init (_ link: DisplayLink) {
        _link = link
    }
    
    weak var _link: DisplayLink!
    
    @objc func _callback () {
        _link?._callback()
    }
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment