定时器,计时器底层实现,每个方法都很简单
#import <Foundation/Foundation.h>
typedef void (^taskBlock)(void);
@interface XMTimer : NSObject
+ (void) startTimerTask:(NSInteger) startTime interval :(NSInteger) interval taskBlock :(taskBlock) block ;
+ (void) startTimerTask:(NSInteger) startTime interval :(NSInteger) interval durationTime :(NSInteger) durationTime taskBlock :(taskBlock) block taskEndBlock :(taskBlock) taskEndBlock ;
+ (void) startTimerTask:(NSInteger) startTime durationTime :(NSInteger) durationTime taskBlock :(taskBlock) block ;
@end
#import "XMTimer.h"
@implementation XMTimer
+ (void) startTimerTask:(NSInteger) startTime interval :(NSInteger) interval taskBlock :(taskBlock) block {
NSInteger start = [NSDate date].timeIntervalSince1970;
while (true) {
NSInteger current = [NSDate date].timeIntervalSince1970;
if (current-startTime >= start) {
start = current;
block();
while (true) {
current = [NSDate date].timeIntervalSince1970;
if (current-interval >= start) {
start = current;
block();
}
}
}
}
}
+ (void) startTimerTask:(NSInteger) startTime interval :(NSInteger) interval durationTime :(NSInteger) durationTime taskBlock :(taskBlock) block taskEndBlock :(taskBlock) taskEndBlock {
NSInteger start = [NSDate date].timeIntervalSince1970;
while (true) {
NSInteger current = [NSDate date].timeIntervalSince1970;
if (current-startTime >= start) {
NSInteger startTask = current;
start = current;
block();
while (true) {
current = [NSDate date].timeIntervalSince1970;
if (current-durationTime >= startTask) {
taskEndBlock();
return;
}
if (current-interval >= start) {
start = current;
block();
}
}
}
}
}
+ (void) startTimerTask:(NSInteger) startTime durationTime :(NSInteger) durationTime taskBlock :(taskBlock) block {
NSInteger start = [NSDate date].timeIntervalSince1970;
while (true) {
NSInteger current = [NSDate date].timeIntervalSince1970;
if (current-startTime >= start) {
start = current;
while (true) {
current = [NSDate date].timeIntervalSince1970;
if (current-durationTime >= start) {
block();
return;
}
}
}
}
}
@end
开括下思维,方法内部实现看起来有点啰嗦。。。但是他是电脑啊,他的计算能力绝对是超出你想象的。性能上面不用你考虑
测试
[XMTimer startTimerTask:1 interval:1 taskBlock:^{
NSLog(@"%@",[NSDate date]);
}];
结果
有空的话,我会整理一下多线程的实现原理