iOS Debounce函數(shù)防抖

防抖指的是一定時(shí)間內(nèi)多次觸發(fā)的方法只執(zhí)行最后一次,防止方法被高頻調(diào)用,也可以說(shuō)方法在一定時(shí)間后才執(zhí)行,如果在這個(gè)時(shí)間段中繼續(xù)觸發(fā)則重新計(jì)時(shí)。

蘋(píng)果并未提供這個(gè)輪子,所以我們可以自己簡(jiǎn)單造一個(gè)。

我們這個(gè)輪子主要起一個(gè)橋接的作用,所以它的接口至少需要以下幾個(gè)參數(shù):

Target:方法調(diào)用者
Function:方法名稱(chēng)
UserInfo:參數(shù)

我們同時(shí)還需要一個(gè)間隔interval,標(biāo)識(shí)interval內(nèi)觸發(fā)重新計(jì)時(shí)。

整理一下像下面這樣:

/**
 函數(shù)防抖

 @param target target
 @param function 方法SEL
 @param userInfo 參數(shù)
 @param interval 防抖間隔
 */
- (void)debounceTarget:(id)target function:(SEL)function userInfo:(id)userInfo interval:(NSUInteger)interval;

在實(shí)現(xiàn)內(nèi)部需要方法、參數(shù)之類(lèi)的信息保存,選擇了Dictionary:

/**
 方法
 */
@property (nonatomic,strong) NSMutableDictionary *funDic;

/**
 參數(shù)
 */
@property (nonatomic,strong) NSMutableDictionary *userinfoDic;

兩個(gè)字典分別保存了方法和參數(shù),便于取消之前的方法。

- (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]) {
        //重新延遲執(zhí)行
        [NSObject cancelPreviousPerformRequestsWithTarget:target selector:function object:last_userInfo];
        if (userInfo) {
            [self.userinfoDic setObject:userInfo forKey:functionStr];
        }
    } else {
        //設(shè)置延遲執(zhí)行,并儲(chǔ)存這個(gè)方法名
        if (target && functionStr) {
            [self.funDic setObject:target forKey:functionStr];
            if (userInfo) {
                [self.userinfoDic setObject:userInfo forKey:functionStr];
            }
        }
    }
    [target performSelector:function withObject:userInfo afterDelay:interval];
}

很簡(jiǎn)單的一個(gè)工具類(lèi),Git地址:https://github.com/QiuYunxiang/Debounce

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容