From 93d5617047967403f7ddd0ca43fde2a12d3a5023 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=A8=81?= Date: Wed, 12 Jul 2017 17:04:44 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=B8=A4=E4=B8=AA=E5=8F=AF?= =?UTF-8?q?=E4=BB=A5=E6=8C=87=E5=AE=9Arunloop=20mode=E7=9A=84=E9=87=8D?= =?UTF-8?q?=E8=BD=BD=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Classes/HWWeakTimer.h | 12 +++++++ Classes/HWWeakTimer.m | 74 ++++++++++++++++++++++++++++++------------- 2 files changed, 64 insertions(+), 22 deletions(-) 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