diff --git a/Classes/HWWeakTimer.h b/Classes/HWWeakTimer.h index fac5f0c..a8d7c39 100755 --- a/Classes/HWWeakTimer.h +++ b/Classes/HWWeakTimer.h @@ -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 diff --git a/Classes/HWWeakTimer.m b/Classes/HWWeakTimer.m index c3ac417..9a42d8d 100755 --- a/Classes/HWWeakTimer.m +++ b/Classes/HWWeakTimer.m @@ -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]; @@ -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]; @@ -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 { @@ -94,4 +124,4 @@ + (void)_timerBlockInvoke:(NSArray*)userInfo { } } -@end \ No newline at end of file +@end