ios 定时器,计时器实现原理

定时器,计时器底层实现,每个方法都很简单

#import <Foundation/Foundation.h>


typedef void (^taskBlock)(void);

@interface XMTimer : NSObject

///startTime 几秒后开始 interval执行间隔 block要执行的代码 这个方法开始计时后无限执行
+ (void) startTimerTask:(NSInteger) startTime interval :(NSInteger) interval taskBlock :(taskBlock) block ;

///startTime 几秒后开始 interval执行间隔 durationTime执行总时间 block要执行的代码 taskEndBlock任务结束要执行的代码 
+ (void) startTimerTask:(NSInteger) startTime interval :(NSInteger) interval durationTime :(NSInteger) durationTime taskBlock :(taskBlock) block taskEndBlock :(taskBlock) taskEndBlock ;

///startTime 几秒后开始 durationTime执行总时间 block要执行的代码  定时器
+ (void) startTimerTask:(NSInteger) startTime durationTime :(NSInteger) durationTime taskBlock :(taskBlock) block ;


@end



#import "XMTimer.h"

@implementation XMTimer

///startTime 几秒后开始 interval执行间隔 block要执行的代码 这个方法开始计时后无限执行
+ (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();
                    
                }
                
            }
            
        }
        
    }
}

///startTime 几秒后开始 interval执行间隔 durationTime执行总时间 block要执行的代码 taskEndBlock任务结束要执行的代码 
+ (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();
                    
                }
                
            }
            
        }
        
    }
}

///startTime 几秒后开始 durationTime执行总时间 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]);
    }];



结果

在这里插入图片描述

有空的话,我会整理一下多线程的实现原理

发布了15 篇原创文章 · 获赞 8 · 访问量 5718

猜你喜欢

转载自blog.csdn.net/qq_41586150/article/details/104081240