有时候我们要限制一些函数的调用频率,比如自动刷新,一分钟内不论谁调用这个函数,只能调用一次.这里提供一个简单好用的方法:
限制一定时间内重复调用方法: 整个app里 同一个name 的block里面的方法 limit秒时间内不可以执行
[JDRateLimit executeBlock:^{
[self refresh:nil ];
} name:@"方法名称,应唯一" limit:300.0];
.h
@interface JDRateLimit : NSObject
//限制一定时间内重复调用方法: 整个app里 同一个name 的block里面的方法 limit秒时间内不可以执行
+ (BOOL)executeBlock:(void(^)(void))block name:(NSString *)name limit:(NSTimeInterval)limit;
//移除限制
+ (void)resetLimitForName:(NSString *)name;
#import "JDRateLimit.h"
.m
@interface JDRateLimit ()
+ (NSMutableDictionary *)_dictionary;
@end
@implementation JDRateLimit
+ (BOOL)executeBlock:(void(^)(void))block name:(NSString *)name limit:(NSTimeInterval)limit {
if (!block) {
return NO;
}
//查看上次执行这个函数 到现在的时间间隔有没有达到时间间隔限制
NSMutableDictionary *dictionary = [self _dictionary];
NSDate *last = [dictionary objectForKey:name];
NSTimeInterval timeInterval = [last timeIntervalSinceNow];
// 如果时间间隔小于limit,这个函数不执行
if (timeInterval < 0 && fabs(timeInterval) < limit) {
return NO;
}
// 执行
block();
[dictionary setObject:[NSDate date] forKey:name];
return YES;
}
//移除限制
+ (void)resetLimitForName:(NSString *)name {
[[self _dictionary] removeObjectForKey:name];
}
#pragma mark - Private
+ (NSMutableDictionary *)_dictionary {
static NSMutableDictionary *dictionary = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
dictionary = [[NSMutableDictionary alloc] init];
});
return dictionary;
}
@end
网友评论