【问题标题】:Prevent users from pressing a button x times per second防止用户每秒按 x 次按钮
【发布时间】:2016-03-02 15:42:00
【问题描述】:

我在应用程序中有一个UIButton,它允许用户向 API 发送请求。

如何防止用户每秒按此按钮超过 X 次?

【问题讨论】:

    标签: ios swift uibutton


    【解决方案1】:

    我假设您只想忽略按钮上的点击(如果它们过于频繁),但您不需要将按钮设置为在忽略点击时显示为禁用状态。 (如果要更改按钮外观,则需要使用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
        }
    

    【讨论】:

      【解决方案2】:

      您可以使用UIButtonisEnabled 属性。 对于按钮的目标,在 @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)

      我自己使用它,它几乎在任何情况下都能可靠地工作。

      希望这个答案可以帮助您或其他有同样问题的人。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-11
        • 2020-06-11
        • 2016-05-20
        • 1970-01-01
        • 2011-09-02
        • 1970-01-01
        • 2018-10-07
        • 2013-05-18
        相关资源
        最近更新 更多