防抖指的是一定时间内多次触发的方法只执行最后一次,防止方法被高频调用,也可以说方法在一定时间后才执行,如果在这个时间段中继续触发则重新计时。
苹果并未提供这个轮子,所以我们可以自己简单造一个。
我们这个轮子主要起一个桥接的作用,所以它的接口至少需要以下几个参数:
Target:方法调用者
Function:方法名称
UserInfo:参数
我们同时还需要一个间隔interval,标识interval内触发重新计时。
整理一下像下面这样:
/**
函数防抖
@param target target
@param function 方法SEL
@param userInfo 参数
@param interval 防抖间隔
*/
- (void)debounceTarget:(id)target function:(SEL)function userInfo:(id)userInfo interval:(NSUInteger)interval;
在实现内部需要方法、参数之类的信息保存,选择了Dictionary:
/**
方法
*/
@property (nonatomic,strong) NSMutableDictionary *funDic;
/**
参数
*/
@property (nonatomic,strong) NSMutableDictionary *userinfoDic;
两个字典分别保存了方法和参数,便于取消之前的方法。
- (void)debounceTarget:(id)target function:(SEL)function userInfo:(id)userInfo interval:(NSUInteger)interval {
NSString *functionStr = NSStringFromSelector(function);
id last_userInfo = [self.userinfoDic objectForKey:functionStr];
if ([self.funDic objectForKey:functionStr]) {
//重新延迟执行
[NSObject cancelPreviousPerformRequestsWithTarget:target selector:function object:last_userInfo];
if (userInfo) {
[self.userinfoDic setObject:userInfo forKey:functionStr];
}
} else {
//设置延迟执行,并储存这个方法名
if (target && functionStr) {
[self.funDic setObject:target forKey:functionStr];
if (userInfo) {
[self.userinfoDic setObject:userInfo forKey:functionStr];
}
}
}
[target performSelector:function withObject:userInfo afterDelay:interval];
}
很简单的一个工具类,Git地址:https://github.com/QiuYunxiang/Debounce