場景描述:在一個UITableView中, 點擊某些cell需要刷新表熊痴,但是當(dāng)我連續(xù)點擊這些cell的時候,我不想tableView 連續(xù)執(zhí)行刷新操作果善,因為這樣很浪費內(nèi)存,但是我需要做后一次點擊后巾陕,這個tableView執(zhí)行了刷新操作,于是我寫了一個頻率控制器[歡迎大家指點噢]
//
// 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 單位為毫秒【調(diào)用時間間隔】
*
* @return 延時器
*/
+ (QKTimeDelay *)start:(NSUInteger )delayLong;
/**
* 到了延時時間了
*/
@property (nonatomic,copy) void (^toTime)();
/**
* 外部需要延時的方法調(diào)用此方法
* 條件達(dá)到后會調(diào)用 toTime 回調(diào)
*/
- (void)delayMethod;
@end
在需要使用頻率控制的地方鄙煤,調(diào)用start可以生成一個頻率/延時控制器,以后在調(diào)用需要控制頻率的方法梯刚,我們不調(diào)用本身的方法凉馆,改用delayMethod预愤,在toTime的回調(diào)中我們在調(diào)用那個被控制了的方法植康。
/**************************************************
NSTimeInterval double 類型的數(shù)據(jù) 小數(shù)點前面是秒數(shù)
所以想取到毫秒數(shù) X 1000就可以了
***************************************************/
#import "QKTimeDelay.h"
@interface QKTimeDelay ()
/**
* 上一次刷新的時間
*/
@property (nonatomic,assign)NSTimeInterval firstTime;
/**
* 當(dāng)前時間的毫秒數(shù)
*/
@property (nonatomic,assign)NSTimeInterval now;
/**
* 延時的時長 單位為毫秒
*/
@property (nonatomic,assign)NSUInteger delayTime;
/**
* 是否已經(jīng)有了任務(wù)
*/
@property (nonatomic,assign)BOOL hasTarget;
@end
/**
* 延時控制
*/
@implementation QKTimeDelay
/**
* 開啟一個延時器
*
* @param delayLong 單位為毫秒【調(diào)用時間間隔】
*
* @return 延時器
*/
+ (QKTimeDelay *)start:(NSUInteger )delayLong
{
QKTimeDelay *timeDelay = [[QKTimeDelay alloc] init];
//初始化時間
timeDelay.firstTime = [[NSDate date] timeIntervalSince1970];
//設(shè)置延時的時長
timeDelay.delayTime = delayLong;
return timeDelay;
}
- (void)delayMethod
{
if (self.hasTarget)
return;
//還沒有開啟定時任務(wù)
self.now = [[NSDate date] timeIntervalSince1970];
if ((self.now - self.firstTime) > self.delayTime)
{
//可以直接調(diào)用方法啦
[self openMethod];
return;
}else
{
//開啟定時任務(wù)
[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;
}
/**
* 開啟一個定時任務(wù)
*/
- (void)startBackTarget
{
self.hasTarget = YES;
[self performSelector:@selector(openMethod)
withObject:nil
afterDelay:haoMiaoToMiao(self.delayTime)];
}
/**
* 毫秒--》秒
*
* @param haoMiao 毫秒數(shù)
*
* @return 秒數(shù)
*/
NSTimeInterval haoMiaoToMiao(NSTimeInterval haoMiao)
{
return (haoMiao/1000);
}
@end
頻率控制器的實現(xiàn)基本思路是:在我開啟一個頻率控制器后,紀(jì)錄一下當(dāng)前的時間和我的延遲的時長存崖,當(dāng)外部調(diào)用我們的延遲方法(也就是控制頻率的方法)我們先看看是不是已經(jīng)在后臺開啟了一個方法等待調(diào)用被控制的方法,如果有了就不需要處理冗栗,等待后臺任務(wù)完成隅居,如果沒有葛虐,看看當(dāng)前的時間和上次刷新的時間差值是否達(dá)到了要求,如果達(dá)到了就直接調(diào)用控制方法的回調(diào)涕蚤,如果沒有就在后臺開啟一個定時任務(wù)的诵。
測試
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];
總共調(diào)用了兩次申钩,dispatch開啟的任務(wù)有一次瘪阁,外面的有1次