美文网首页程序员
限制一定时间内重复调用方法

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

作者: 江水东流 | 来源:发表于2017-12-20 10:10 被阅读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
    

    相关文章

      网友评论

        本文标题: 限制一定时间内重复调用方法

        本文链接:https://www.haomeiwen.com/subject/gdnwwxtx.html