我在应用程序中有一个UIButton
,允许用户向API发送请求。
如何防止用户每秒按下此按钮超过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()
}
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
}
UIButton
的isEnabled
属性。对于你的按钮目标,在你的@objc
选择器函数的末尾添加以下内容:@objc func handleMyButtonPress() {
self.someOtherFunction()
myButton.isEnabled = false
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
myButton.isEnabled = true
}
}
.now() + 1
截止时间基本上是指,1秒后按钮将再次启用,您的用户可以与其进行交互。
如果需要5分钟的延迟,您可以使用 .now() + (60 * 5)
我自己使用这个方法,在几乎任何情况下都能可靠地运行。
希望这个答案能够帮助您或其他遇到相同问题的人。