2016-03-02 56 views

回答

2

我假設你只想忽略按鈕上的按鈕,如果它們太頻繁了,但你不需要設置按鈕在被忽略的情況下被禁用。 (如果要更改按鈕外觀,則需要使用NSTimer或其他延遲操作來重新啓用按鈕,這是一個非常複雜的問題。)

如果將要求更改爲「至少1/X秒之間「,這有點簡單。例如,不是每秒最多可以進行4次敲擊,如果敲擊時間小於1/4秒,我們將忽略一次敲擊。

要實現此要求,請存儲最後一次敲擊的時間。當敲擊到達時,看看自上次敲擊以來是否已經過1/X秒。如果不是,則忽略輕敲。

private let minimumTapInterval = 1/CFTimeInterval(4) 
    private var lastTapTime = CFAbsoluteTime(0) 

    @IBAction func buttonWasTapped(sender: AnyObject?) { 
     let now = CFAbsoluteTimeGetCurrent() 
     guard now >= lastTapTime + minimumTapInterval else { return } 
     lastTapTime = now 
     sendAPIRequest() 
    } 

如果您確實想要實施「每秒不超過X個水龍頭」的要求,您可以存儲接受的水龍頭的時間。當新的水龍頭進來時,扔掉超過一秒的存儲時間。如果仍有至少X次存儲時間,則忽略新的水龍頭。

private let maxTapsPerSecond = 4 
    private var tapTimes = [CFAbsoluteTime]() 

    @IBAction func buttonWasTapped(sender: AnyObject?) { 
     let now = CFAbsoluteTimeGetCurrent() 
     let oneSecondAgo = now - 1 
     tapTimes = tapTimes.filter { $0 >= oneSecondAgo } 
     // All elements of tapTimes are now within the last second. 
     guard tapTimes.count < maxTapsPerSecond else { return } 
     tapTimes.append(now) 
     sendAPIRequest 
    }