我在应用中有一个UIButton
,允许用户向API发送请求。
如何阻止用户每秒按此按钮超过X次?
答案 0 :(得分:3)
我假设您只想忽略按钮上的按钮,如果它们太频繁,但您不需要将按钮设置为禁用,同时忽略按钮。 (如果您想更改按钮外观,则需要使用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
}
答案 1 :(得分:0)
您可以使用 isEnabled
的 UIButton
属性。
对于按钮的目标,在 @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)
我自己使用它,它几乎在任何情况下都能可靠地工作。
希望这个答案可以帮助您或其他遇到相同问题的人。