653,防抖和節(jié)流

了解了新的專業(yè)名詞:函數(shù)防抖畦浓、函數(shù)節(jié)流源葫;雖是第一次知道這個詞产还,但平常開發(fā)中其實早已接觸使用過了;

防抖與節(jié)流是處理頻繁事件的技術:用以限制事件頻繁地發(fā)生可能造成的問題屯蹦,如:

  • 多次執(zhí)行同一事件维哈,造成事件疊加帶來不必要的影響(iOS典型的例子是點擊按鈕Push到其他vc時會連續(xù)跳轉(zhuǎn)多次)
  • 頻繁渲染界面等帶來的性能問題
  • 頻繁調(diào)用接口請求數(shù)據(jù)帶來的流量壓力

節(jié)流(throttle)

節(jié)流是指高頻事件觸發(fā),但在n秒內(nèi)只會執(zhí)行一次登澜,所以節(jié)流會稀釋函數(shù)的執(zhí)行頻率阔挠;

應用場景:
頻繁點擊按鈕只響應一次事件

防抖(debounce

防抖是指觸發(fā)高頻事件后n秒內(nèi)函數(shù)只會執(zhí)行一次,如果n秒內(nèi)高頻事件再次被觸發(fā)脑蠕,則重新計算時間;

應用場景:
輸入框輸入文字時實時搜索功能

節(jié)流和防抖的區(qū)別

簡單來說節(jié)流是控制頻率购撼,防抖是控制次數(shù)
單從字面理解的話跪削,防抖節(jié)流容易搞混且不太好理解;下面引用一張圖說明:

image.png

以上圖基礎 舉個例子:
Button點擊事件有可能存在極短時間內(nèi)迂求,頻繁的點擊了多次的情況碾盐;針對這種情況分別做節(jié)流和防抖處理interval設置為1000ms,實際的效果如下:

  • 函數(shù)節(jié)流
    在1000ms內(nèi)連續(xù)點擊了3次揩局,button響應事件a毫玖、x、y谐腰;最終只會立即執(zhí)行a孕豹,丟棄x涩盾、y十气;如果在m ms內(nèi)連續(xù)點擊了n 次,最終會執(zhí)行時間 m/1000 + 1 個事件春霍;即不管有多少事件interval計算是固定的砸西;
  • 函數(shù)防抖
    在1000ms內(nèi)連續(xù)點擊了2次b、c址儒;最終會已最后一次點擊c為準重新計時芹枷,當時間達到interval才執(zhí)行c;而前面的b會丟棄莲趣;如果在m ms內(nèi)連續(xù)點擊了n 次鸳慈,且每每2個點擊間隔都沒有超過1000ms最終只會在n點擊1000ms后執(zhí)行第n個事件(只有一個事件);即interval計算是動態(tài)的喧伞,每次都會以最后一個重新計時走芋;

iOS實現(xiàn)

知道了思路后,其實不同語言實現(xiàn)起來都不難了潘鲫;iOS這邊可以直接使用dispatch實現(xiàn)(當然也有其他方式)

@implementation MMThrottler

- (instancetype)init {
    self = [super init];
    if (self) {
        _interval = .2;
        _queue = dispatch_get_main_queue();
        _previousDate = NSDate.distantPast;
        _semaphore = dispatch_semaphore_create(1);
    }
    return self;
}

- (void)execute:(void(^)())action {
    __weak typeof(self) selfWeak = self;
    dispatch_semaphore_wait(_semaphore, DISPATCH_TIME_FOREVER);
    
    if (_blockItem) {
        // 取消上一次事件
        dispatch_block_cancel(_blockItem);
    }
    
    _blockItem = dispatch_block_create(DISPATCH_BLOCK_BARRIER, ^{
        selfWeak.previousDate = NSDate.date;
        action();
    });
    
    NSTimeInterval seconds = [NSDate.date timeIntervalSinceDate:_previousDate];
    NSTimeInterval delaySeconds = seconds > _interval ? 0 : _interval;
    if (seconds > _interval) {
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delaySeconds * NSEC_PER_SEC)), _queue, _blockItem);
    }
    
    dispatch_semaphore_signal(_semaphore);
}

@end
@implementation MMDebouncer

- (instancetype)init {
    self = [super init];
    if (self) {
        _interval = .5;
        _queue = dispatch_get_main_queue();
        _semaphore = dispatch_semaphore_create(1);
    }
    return self;
}

- (void)execute:(void(^)())action {
    dispatch_semaphore_wait(_semaphore, DISPATCH_TIME_FOREVER);
    
    if (_blockItem) {
        // 取消上一次事件
        dispatch_block_cancel(_blockItem);
    }
    
    _blockItem = dispatch_block_create(DISPATCH_BLOCK_BARRIER, ^{
        action();
    });
    
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(_interval * NSEC_PER_SEC)), _queue, _blockItem);
    
    dispatch_semaphore_signal(_semaphore);
}

@end

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末翁逞,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子溉仑,更是在濱河造成了極大的恐慌挖函,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件浊竟,死亡現(xiàn)場離奇詭異怨喘,居然都是意外死亡,警方通過查閱死者的電腦和手機振定,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門哲思,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人吩案,你說我怎么就攤上這事棚赔。” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵靠益,是天一觀的道長丧肴。 經(jīng)常有香客問我,道長胧后,這世上最難降的妖魔是什么芋浮? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮壳快,結(jié)果婚禮上纸巷,老公的妹妹穿的比我還像新娘。我一直安慰自己眶痰,他們只是感情好瘤旨,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著竖伯,像睡著了一般存哲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上七婴,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天祟偷,我揣著相機與錄音,去河邊找鬼打厘。 笑死修肠,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的户盯。 我是一名探鬼主播嵌施,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼先舷!你這毒婦竟也來了艰管?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤蒋川,失蹤者是張志新(化名)和其女友劉穎牲芋,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捺球,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡缸浦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了氮兵。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片裂逐。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖泣栈,靈堂內(nèi)的尸體忽然破棺而出卜高,到底是詐尸還是另有隱情弥姻,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布掺涛,位于F島的核電站庭敦,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏薪缆。R本人自食惡果不足惜秧廉,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望拣帽。 院中可真熱鬧疼电,春花似錦、人聲如沸减拭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽峡谊。三九已至茫虽,卻和暖如春刊苍,著一層夾襖步出監(jiān)牢的瞬間既们,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工正什, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留啥纸,地道東北人。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓婴氮,卻偏偏與公主長得像斯棒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子主经,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 最近編寫vue前端項目時荣暮,了解了新的專業(yè)名詞:函數(shù)防抖、函數(shù)節(jié)流罩驻;雖是第一次知道這個詞穗酥,但平常開發(fā)中其實早已接觸使...
    _小沫閱讀 807評論 0 0
  • 函數(shù)防抖(debounce): 含義:延遲函數(shù)執(zhí)行 ; 用處:多用于input框輸入時惠遏,顯示匹配的輸入內(nèi)容砾跃。(n秒...
    laogui_閱讀 740評論 0 0
  • 防抖和節(jié)流都是為了解決短時間內(nèi)大量觸發(fā)某函數(shù)而導致的性能問題,比如觸發(fā)頻率過高導致的響應速度跟不上觸發(fā)頻率节吮,出現(xiàn)延...
    _SweetHeart閱讀 381評論 0 1
  • 1. 認識防抖和節(jié)流 1.1. 對防抖和節(jié)流的認識 防抖和節(jié)流的概念其實最早并不是出現(xiàn)在軟件工程中抽高,防抖是出現(xiàn)在電...
    AShuiCoder閱讀 1,109評論 0 10
  • 防抖throttle 防抖:當事件在短時間內(nèi)持續(xù)觸發(fā),在間隔時間內(nèi)(如1000ms)透绩,只在最后一次觸發(fā)的時候翘骂,執(zhí)行...
    還在努力的烏賊閱讀 330評論 0 0