forked from gnachman/iTerm2
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathNSTimer+iTerm.m
79 lines (65 loc) · 2.63 KB
/
NSTimer+iTerm.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
//
// NSTimer+iTerm.m
// iTerm2
//
// Created by George Nachman on 8/1/17.
//
//
#import "NSTimer+iTerm.h"
@interface iTermTimerProxy : NSObject
@property (nonatomic, weak) id target;
@property (nonatomic) SEL selector;
- (void)performBlock:(NSTimer *)timer;
@end
@implementation iTermTimerProxy
- (void)timerDidFire:(NSTimer *)timer {
id target = self.target;
if (target) {
((void (*)(id, SEL, NSTimer *))[target methodForSelector:self.selector])(self.target, self.selector, timer);
}
}
- (void)performBlock:(NSTimer *)timer {
void (^block)(NSTimer * _Nonnull) = timer.userInfo;
if (block != nil) {
block(timer);
}
}
@end
@implementation NSTimer (iTerm)
+ (instancetype)weakTimerWithTimeInterval:(NSTimeInterval)interval target:(id)target selector:(SEL)selector userInfo:(id)userInfo repeats:(BOOL)repeats {
iTermTimerProxy *proxy = [[iTermTimerProxy alloc] init];
proxy.target = target;
proxy.selector = selector;
return [NSTimer timerWithTimeInterval:interval
target:proxy
selector:@selector(timerDidFire:)
userInfo:userInfo
repeats:repeats];
}
+ (instancetype)scheduledWeakTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo {
iTermTimerProxy *proxy = [[iTermTimerProxy alloc] init];
proxy.target = aTarget;
proxy.selector = aSelector;
return [NSTimer scheduledTimerWithTimeInterval:ti
target:proxy
selector:@selector(timerDidFire:)
userInfo:userInfo
repeats:yesOrNo];
}
+ (instancetype)it_scheduledTimerWithTimeInterval:(NSTimeInterval)timeInterval
repeats:(BOOL)repeats
block:(void (^_Nonnull)(NSTimer * _Nonnull timer))block {
iTermTimerProxy *proxy = [[iTermTimerProxy alloc] init];
return [NSTimer scheduledTimerWithTimeInterval:timeInterval
target:proxy
selector:@selector(performBlock:)
userInfo:[block copy]
repeats:repeats];
}
- (void)it_performSelector:(SEL)selector onTarget:(id)target {
if (target) {
void (*func)(id, SEL, NSTimer *) = (void *)[target methodForSelector:selector];
func(target, selector, self);
}
}
@end