程序员

限制一定时间内重复调用方法

2017-12-20  本文已影响167人  江水东流

有时候我们要限制一些函数的调用频率,比如自动刷新,一分钟内不论谁调用这个函数,只能调用一次.这里提供一个简单好用的方法:
限制一定时间内重复调用方法: 整个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
上一篇 下一篇

猜你喜欢

热点阅读