场景描述:在一个UITableView中, 点击某些cell需要刷新表,但是当我连续点击这些cell的时候,我不想tableView 连续执行刷新操作,因为这样很浪费内存,但是我需要做后一次点击后,这个tableView执行了刷新操作,于是我写了一个频率控制器[欢迎大家指点噢]
//
// QKTimeDelay.h
// EasyIOS
//
// Created by EasyIOS on 16/7/8.
// Copyright © 2016年 EasyIOS. All rights reserved.
//
#import <Foundation/Foundation.h>
/**
* 延时控制
*/
@interface QKTimeDelay : NSObject
/**
* 开启一个延时器
*
* @param delayLong 单位为毫秒【调用时间间隔】
*
* @return 延时器
*/
+ (QKTimeDelay *)start:(NSUInteger )delayLong;
/**
* 到了延时时间了
*/
@property (nonatomic,copy) void (^toTime)();
/**
* 外部需要延时的方法调用此方法
* 条件达到后会调用 toTime 回调
*/
- (void)delayMethod;
@end
在需要使用频率控制的地方,调用start可以生成一个频率/延时控制器,以后在调用需要控制频率的方法,我们不调用本身的方法,改用delayMethod,在toTime的回调中我们在调用那个被控制了的方法。
/**************************************************
NSTimeInterval double 类型的数据 小数点前面是秒数
所以想取到毫秒数 X 1000就可以了
***************************************************/
#import "QKTimeDelay.h"
@interface QKTimeDelay ()
/**
* 上一次刷新的时间
*/
@property (nonatomic,assign)NSTimeInterval firstTime;
/**
* 当前时间的毫秒数
*/
@property (nonatomic,assign)NSTimeInterval now;
/**
* 延时的时长 单位为毫秒
*/
@property (nonatomic,assign)NSUInteger delayTime;
/**
* 是否已经有了任务
*/
@property (nonatomic,assign)BOOL hasTarget;
@end
/**
* 延时控制
*/
@implementation QKTimeDelay
/**
* 开启一个延时器
*
* @param delayLong 单位为毫秒【调用时间间隔】
*
* @return 延时器
*/
+ (QKTimeDelay *)start:(NSUInteger )delayLong
{
QKTimeDelay *timeDelay = [[QKTimeDelay alloc] init];
//初始化时间
timeDelay.firstTime = [[NSDate date] timeIntervalSince1970];
//设置延时的时长
timeDelay.delayTime = delayLong;
return timeDelay;
}
- (void)delayMethod
{
if (self.hasTarget)
return;
//还没有开启定时任务
self.now = [[NSDate date] timeIntervalSince1970];
if ((self.now - self.firstTime) > self.delayTime)
{
//可以直接调用方法啦
[self openMethod];
return;
}else
{
//开启定时任务
[self startBackTarget];
return;
}
}
/**
* 开启被延时的方法
*/
- (void)openMethod
{
if (self.toTime)
self.toTime();
NSDate *now = [NSDate date];
self.firstTime = [now timeIntervalSince1970];
self.now = self.firstTime;
self.hasTarget = NO;
}
/**
* 开启一个定时任务
*/
- (void)startBackTarget
{
self.hasTarget = YES;
[self performSelector:@selector(openMethod)
withObject:nil
afterDelay:haoMiaoToMiao(self.delayTime)];
}
/**
* 毫秒--》秒
*
* @param haoMiao 毫秒数
*
* @return 秒数
*/
NSTimeInterval haoMiaoToMiao(NSTimeInterval haoMiao)
{
return (haoMiao/1000);
}
@end
频率控制器的实现基本思路是:在我开启一个频率控制器后,纪录一下当前的时间和我的延迟的时长,当外部调用我们的延迟方法(也就是控制频率的方法)我们先看看是不是已经在后台开启了一个方法等待调用被控制的方法,如果有了就不需要处理,等待后台任务完成,如果没有,看看当前的时间和上次刷新的时间差值是否达到了要求,如果达到了就直接调用控制方法的回调,如果没有就在后台开启一个定时任务。
测试
self.timeDealy = [QKTimeDelay start:2000];
self.timeDealy.toTime = ^{
NSLog(@"refresh");
};
[self.timeDealy delayMethod];
[self.timeDealy delayMethod];
[self.timeDealy delayMethod];
[self.timeDealy delayMethod];
[self.timeDealy delayMethod];
[self.timeDealy delayMethod];
[self.timeDealy delayMethod];
[self.timeDealy delayMethod];
[self.timeDealy delayMethod];
[self.timeDealy delayMethod];
[self.timeDealy delayMethod];
[self.timeDealy delayMethod];
@weakify(self);
dispatch_time_t after
= dispatch_time(DISPATCH_TIME_NOW,
1820*NSEC_PER_MSEC);
dispatch_after(after, dispatch_get_main_queue(),
^{
@strongify(self);
[self.timeDealy delayMethod];
});
[self delayLoad];
打印结果.png
总共调用了两次,dispatch开启的任务有一次,外面的有1次
网友评论