Skip to content

Instantly share code, notes, and snippets.

@stephanecopin
Last active April 9, 2018 20:23
Show Gist options
  • Save stephanecopin/c746993d7431ceaaee718a9a491a5cfa to your computer and use it in GitHub Desktop.
Save stephanecopin/c746993d7431ceaaee718a9a491a5cfa to your computer and use it in GitHub Desktop.
Extension to create Timer/CADisplayLink which don't strongly reference their target
private class WeakTarget: NSObject {
private(set) weak var target: AnyObject?
let selector: Selector
static let triggerSelector = #selector(WeakTarget.timerDidTrigger(parameter:))
init(_ target: AnyObject, selector: Selector) {
self.target = target
self.selector = selector
}
@objc private func timerDidTrigger(parameter: Any) {
_ = self.target?.perform(self.selector, with: parameter)
}
}
extension Timer {
convenience init(timeInterval ti: TimeInterval, weakTarget: AnyObject, selector: Selector, userInfo: Any?, repeats: Bool) {
self.init(timeInterval: ti, target: WeakTarget(weakTarget, selector: selector), selector: WeakTarget.triggerSelector, userInfo: userInfo, repeats: repeats)
}
class func scheduledTimer(timeInterval ti: TimeInterval, weakTarget: AnyObject, selector: Selector, userInfo: Any?, repeats: Bool) -> Timer {
return self.scheduledTimer(timeInterval: ti, target: WeakTarget(weakTarget, selector: selector), selector: WeakTarget.triggerSelector, userInfo: userInfo, repeats: repeats)
}
}
extension CADisplayLink {
convenience init(weakTarget: AnyObject, selector: Selector) {
self.init(target: WeakTarget(weakTarget, selector: selector), selector: WeakTarget.triggerSelector)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment