// // Copyright (c) 2017 Open Whisper Systems. All rights reserved. // /** * As of iOS10, the timer API's take a block, which makes it easy to reference weak self in Swift. This class offers a * similar API that works pre iOS10. * * Solution modified from * http://stackoverflow.com/questions/16821736/weak-reference-to-nstimer-target-to-prevent-retain-cycle/41003985#41003985 */ final class WeakTimer { fileprivate weak var timer: Timer? fileprivate weak var target: AnyObject? fileprivate let action: (Timer) -> Void fileprivate init(timeInterval: TimeInterval, target: AnyObject, userInfo: Any?, repeats: Bool, action: @escaping (Timer) -> Void) { self.target = target self.action = action self.timer = Timer.scheduledTimer(timeInterval: timeInterval, target: self, selector: #selector(fire), userInfo: userInfo, repeats: repeats) } class func scheduledTimer(timeInterval: TimeInterval, target: AnyObject, userInfo: Any?, repeats: Bool, action: @escaping (Timer) -> Void) -> Timer { return WeakTimer(timeInterval: timeInterval, target: target, userInfo: userInfo, repeats: repeats, action: action).timer! } @objc public func fire(timer: Timer) { if target != nil { action(timer) } else { timer.invalidate() } } }