Skip to content

Commit 07d565c

Browse files
committed
Revert back to having a helper “Actor” class instead of using CGRunLoopTimerCreateWithHandler
1 parent 4de0130 commit 07d565c

File tree

1 file changed

+20
-11
lines changed

1 file changed

+20
-11
lines changed

Sources/SwiftyTimer.swift

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,8 @@ extension NSTimer {
3232
/// - Note: The `new` class function is a workaround for a crashing bug when using convenience initializers (rdar://18720947)
3333

3434
public class func new(after interval: NSTimeInterval, _ block: () -> Void) -> NSTimer {
35-
return CFRunLoopTimerCreateWithHandler(kCFAllocatorDefault, CFAbsoluteTimeGetCurrent() + interval, 0, 0, 0) { _ in
36-
block()
37-
}
35+
let actor = Actor { _ in block() }
36+
return self.init(timeInterval: interval, target: actor, selector: #selector(Actor.fire), userInfo: nil, repeats: false)
3837
}
3938

4039
/// Create a timer that will call `block` repeatedly in specified time intervals.
@@ -44,9 +43,8 @@ extension NSTimer {
4443
/// - Note: The `new` class function is a workaround for a crashing bug when using convenience initializers (rdar://18720947)
4544

4645
public class func new(every interval: NSTimeInterval, _ block: () -> Void) -> NSTimer {
47-
return CFRunLoopTimerCreateWithHandler(kCFAllocatorDefault, CFAbsoluteTimeGetCurrent() + interval, interval, 0, 0) { _ in
48-
block()
49-
}
46+
let actor = Actor { _ in block() }
47+
return self.init(timeInterval: interval, target: actor, selector: #selector(Actor.fire), userInfo: nil, repeats: true)
5048
}
5149

5250
/// Create a timer that will call `block` repeatedly in specified time intervals.
@@ -57,11 +55,8 @@ extension NSTimer {
5755
/// - Note: The `new` class function is a workaround for a crashing bug when using convenience initializers (rdar://18720947)
5856

5957
@nonobjc public class func new(every interval: NSTimeInterval, _ block: NSTimer -> Void) -> NSTimer {
60-
var timer: NSTimer!
61-
timer = CFRunLoopTimerCreateWithHandler(kCFAllocatorDefault, CFAbsoluteTimeGetCurrent() + interval, interval, 0, 0) { _ in
62-
block(timer)
63-
}
64-
return timer
58+
let actor = Actor(block)
59+
return self.init(timeInterval: interval, target: actor, selector: #selector(Actor.fire), userInfo: nil, repeats: true)
6560
}
6661

6762
/// Create and schedule a timer that will call `block` once after the specified time.
@@ -101,6 +96,20 @@ extension NSTimer {
10196
runLoop.addTimer(self, forMode: mode)
10297
}
10398
}
99+
100+
// MARK: - Internals
101+
102+
private class Actor {
103+
var block: NSTimer -> Void
104+
105+
init(_ block: NSTimer -> Void) {
106+
self.block = block
107+
}
108+
109+
@objc func fire(timer: NSTimer) {
110+
block(timer)
111+
}
112+
}
104113
}
105114

106115
// MARK: - Time extensions

0 commit comments

Comments
 (0)