-
-
Save PsychoH13/250662 to your computer and use it in GitHub Desktop.
/* | |
Copyright (c) 2009 Remy Demarest | |
Permission is hereby granted, free of charge, to any person | |
obtaining a copy of this software and associated documentation | |
files (the "Software"), to deal in the Software without | |
restriction, including without limitation the rights to use, | |
copy, modify, merge, publish, distribute, sublicense, and/or sell | |
copies of the Software, and to permit persons to whom the | |
Software is furnished to do so, subject to the following | |
conditions: | |
The above copyright notice and this permission notice shall be | |
included in all copies or substantial portions of the Software. | |
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | |
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES | |
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | |
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT | |
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, | |
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | |
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | |
OTHER DEALINGS IN THE SOFTWARE. | |
*/ | |
#import <Foundation/NSTimer.h> | |
@interface NSTimer (PSYBlockTimer) | |
+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)seconds repeats:(BOOL)repeats usingBlock:(void (^)(NSTimer *timer))fireBlock; | |
+ (NSTimer *)timerWithTimeInterval:(NSTimeInterval)seconds repeats:(BOOL)repeats usingBlock:(void (^)(NSTimer *timer))fireBlock; | |
@end |
/* | |
Copyright (c) 2009 Remy Demarest | |
Permission is hereby granted, free of charge, to any person | |
obtaining a copy of this software and associated documentation | |
files (the "Software"), to deal in the Software without | |
restriction, including without limitation the rights to use, | |
copy, modify, merge, publish, distribute, sublicense, and/or sell | |
copies of the Software, and to permit persons to whom the | |
Software is furnished to do so, subject to the following | |
conditions: | |
The above copyright notice and this permission notice shall be | |
included in all copies or substantial portions of the Software. | |
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | |
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES | |
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | |
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT | |
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, | |
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | |
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | |
OTHER DEALINGS IN THE SOFTWARE. | |
*/ | |
#import "PSYBlockTimer.h" | |
typedef void (^PSYTimerBlock)(NSTimer *); | |
@interface NSTimer (PSYBlockTimer_private) | |
+ (void)PSYBlockTimer_executeBlockWithTimer:(NSTimer *)timer; | |
@end | |
@implementation NSTimer (PSYBlockTimer) | |
+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)seconds repeats:(BOOL)repeats usingBlock:(void (^)(NSTimer *timer))fireBlock | |
{ | |
return [self scheduledTimerWithTimeInterval:seconds target:self selector:@selector(PSYBlockTimer_executeBlockWithTimer:) userInfo:[[fireBlock copy] autorelease] repeats:repeats]; | |
} | |
+ (NSTimer *)timerWithTimeInterval:(NSTimeInterval)seconds repeats:(BOOL)repeats usingBlock:(void (^)(NSTimer *timer))fireBlock | |
{ | |
return [self timerWithTimeInterval:seconds target:self selector:@selector(PSYBlockTimer_executeBlockWithTimer:) userInfo:[[fireBlock copy] autorelease] repeats:repeats]; | |
} | |
@end | |
@implementation NSTimer (PSYBlockTimer_private) | |
+ (void)PSYBlockTimer_executeBlockWithTimer:(NSTimer *)timer | |
{ | |
if([timer isValid]) | |
{ | |
PSYTimerBlock block = [timer userInfo]; | |
block(timer); | |
} | |
} | |
@end |
Nope, there shouldn't be, a class is a normal object and selector search behaves the same way. Since all the data we need to store is the block and the method implementation to execute, a class is fine in this case.
okay, thanks! So, I'm curious why you implemented it twice?
Implemented twice ? The first method schedule the timer immediately, the other one needs to be scheduled on a runloop and started manually.
I came to this via the following URL. https://gist.github.com/250662/d4f99aa9bde841107622c5a239e0fc6fa37cb179
When viewed there, it has the following, which serves to separate two implementations.
if defined(SELF_EXECUTING) && SELF_EXECUTING
Anyway, we're good. Thanks for the explanation and thanks for putting this up.
Looks like google led me to an earlier version.
This is awesomely useful. I was going to write one if you wouldn't have done.
I made a much simpler solution here http://orion98mc.blogspot.com/2012/08/objective-c-blocks-for-fun.html any feedback is welcome.
You version takes less lines indeed, it's a fun version that I didn't think about. Good job.
Glad to see this! I'm curious, why do you have two implementations? Is there something unsafe about doing it through the timer class? (the first implementation)