【问题标题】:Alamofire service calls multiple timesAlamofire 服务调用多次
【发布时间】:2018-12-14 11:51:36
【问题描述】:
Alamofire.request("https://example.com/writecomment.php", method: .post, parameters: parameters).validate().responseJSON { response in
            switch response.result {
            case .success:
                if let json = response.result.value {
                    var success = 0
                    if let dictJSON = json as? [String: AnyObject] {
                        if let successInteger = dictJSON["success"] as? Int {
                            success = successInteger
                            if success == 1
                            {
                                //succes
                            }
                        }
                    }
                }
            case .failure(_):
                return
            }
        }

这是连接到一个 UIButton 动作

当用户点击按钮时,它有时会多次触发服务调用。

如何防止多次调用?

【问题讨论】:

  • 尝试设置断点并检查该行是否被多次调用。
  • 检查按钮操作。应该是touch up inside
  • 这是按钮本身的问题,我不知道是否有更好的方法,但只需检查是否有正在进行的布尔值调用,在请求开始时将其设置为 true,然后设置它收到回调后再次返回 false。
  • @AlizainPrasla 里面已经修好了
  • @emrepun 你能给我举个例子吗?

标签: ios swift alamofire


【解决方案1】:

示例::

var isAPICalling = false

  @IBAction func btnTapped(_ sender: UIButton) {
   if isAPICalling == false
   {
       isAPICalling = true
       self.APICalling() // Your API calling method
   }
 }

APICalling()方法中设置isAPICalling = false当你得到响应时。

其他选项:

当您请求该时间开始指示器和响应停止指示器之后,请使用ActivityIndicator。所以你不能点击按钮。

【讨论】:

    【解决方案2】:

    您可以在不使用标志的情况下做一件事,如果您有按钮插座,那么只需在执行按钮单击操作时选择按钮状态。

    然后调用API,一旦你得到响应,使按钮状态正常。所以当用户点击按钮时它只会调用一次。

        @IBAction func btnApiAction(_ sender: Any) {
           if btnAPI.isSelected == false {
              btnAPI.isSelected = true            
              //Call API here
           }else {
            //Do nothing here
           }
         }
    

    如果 API 调用失败或您遇到任何错误,则还将按钮状态更改为正常,以便用户可以再次单击按钮。

    【讨论】:

      【解决方案3】:

      在调用 API 时禁用 UIButton。并在 api 调用完成后重新启用。

      @IBAction func didTapButton(_ sender: UIButton) {
          sender.isEnabled = false
          Alamofire.request(/* Params */) { response in 
               sender.isEnabled = true
               // parse response - response.result
          }
      }
      

      我更喜欢在按钮视图中添加ActivityIndicatorView,并在完成后删除以获得更好的用户体验。

      【讨论】:

        猜你喜欢
        • 2018-01-28
        • 1970-01-01
        • 2016-05-10
        • 2020-02-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多