Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions Classes/HWWeakTimer.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,4 +37,16 @@ typedef void (^HWTimerHandler)(id userInfo);
userInfo:(id)userInfo
repeats:(BOOL)repeats;

+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)interval
block:(HWTimerHandler)block
userInfo:(id)userInfo
repeats:(BOOL)repeats
inMode:(NSRunLoopMode)mode;

+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)interval
target:(id)aTarget
selector:(SEL)aSelector
userInfo:(id)userInfo
repeats:(BOOL)repeats
inMode:(NSRunLoopMode)mode;
@end
74 changes: 52 additions & 22 deletions Classes/HWWeakTimer.m
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,20 @@ @interface HWWeakTimerTarget : NSObject

@implementation HWWeakTimerTarget

static NSRunLoopMode HWeakTimerRunLoopMode;

+ (void)load
{
[super load];

HWeakTimerRunLoopMode = NSDefaultRunLoopMode;
}

- (void) fire:(NSTimer *)timer {
if(self.target) {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
[self.target performSelector:self.selector withObject:timer.userInfo afterDelay:0.0f inModes:@[NSRunLoopCommonModes]];
[self.target performSelector:self.selector withObject:timer.userInfo afterDelay:0.0f inModes:@[HWeakTimerRunLoopMode]];
#pragma clang diagnostic pop
} else {
[self.timer invalidate];
Expand All @@ -47,30 +56,26 @@ - (void) fire:(NSTimer *)timer {

@implementation HWWeakTimer

+ (NSTimer *) scheduledTimerWithTimeInterval:(NSTimeInterval)interval
target:(id)aTarget
selector:(SEL)aSelector
userInfo:(id)userInfo
repeats:(BOOL)repeats {
HWWeakTimerTarget* timerTarget = [[HWWeakTimerTarget alloc] init];
timerTarget.target = aTarget;
timerTarget.selector = aSelector;

NSTimer *timer = [NSTimer timerWithTimeInterval:interval
target:timerTarget
selector:@selector(fire:)
userInfo:userInfo
repeats:repeats];

[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
timerTarget.timer = timer;
return timerTarget.timer;
+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)interval
target:(id)aTarget
selector:(SEL)aSelector
userInfo:(id)userInfo
repeats:(BOOL)repeats {
return [self scheduledTimerWithTimeInterval:interval target:aTarget selector:aSelector userInfo:userInfo repeats:repeats inMode:NSDefaultRunLoopMode];
}

+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)interval
block:(HWTimerHandler)block
userInfo:(id)userInfo
repeats:(BOOL)repeats {
return [self scheduledTimerWithTimeInterval:interval block:block userInfo:userInfo repeats:repeats inMode:NSDefaultRunLoopMode];
}


+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)interval
block:(HWTimerHandler)block
userInfo:(id)userInfo
repeats:(BOOL)repeats
inMode:(NSRunLoopMode)mode {
NSMutableArray *userInfoArray = [NSMutableArray arrayWithObject:[block copy]];
if (userInfo != nil) {
[userInfoArray addObject:userInfo];
Expand All @@ -79,7 +84,32 @@ + (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)interval
target:self
selector:@selector(_timerBlockInvoke:)
userInfo:[userInfoArray copy]
repeats:repeats];
repeats:repeats
inMode:mode];
}


+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)interval
target:(id)aTarget
selector:(SEL)aSelector
userInfo:(id)userInfo
repeats:(BOOL)repeats
inMode:(NSRunLoopMode)mode {
HWeakTimerRunLoopMode = mode;

HWWeakTimerTarget* timerTarget = [[HWWeakTimerTarget alloc] init];
timerTarget.target = aTarget;
timerTarget.selector = aSelector;

NSTimer *timer = [NSTimer timerWithTimeInterval:interval
target:timerTarget
selector:@selector(fire:)
userInfo:userInfo
repeats:repeats];

[[NSRunLoop currentRunLoop] addTimer:timer forMode:HWeakTimerRunLoopMode];
timerTarget.timer = timer;
return timerTarget.timer;
}

+ (void)_timerBlockInvoke:(NSArray*)userInfo {
Expand All @@ -94,4 +124,4 @@ + (void)_timerBlockInvoke:(NSArray*)userInfo {
}
}

@end
@end