首页 > 解决方案 > iOS Swift 停止重复的 HTTP 请求

问题描述

我是 Swift 的新手,我正在使用 Swift 4。我有一个动作,当点击一个按钮时发送一个 HTTP 请求。在后端,它将记录插入数据库。所有这些都能正常工作,但有时即使我在 Swift 发送 HTTP 请求 2 或 3 次后点击按钮,然后我得到重复记录。有没有办法阻止它?这是我的简单代码

@IBAction func submitAction(_ sender: Any) {

    let url:URL = URL(string:ConnectionString+"insert_location")!
    var myName = ""
    TableSource.isHidden = true
    let session = URLSession.shared
    var request = URLRequest(url: url)
    request.httpMethod = "POST"
    request.cachePolicy = NSURLRequest.CachePolicy.reloadIgnoringCacheData
    if let fullname = UserDefaults.standard.string(forKey: "fullname") {
        myName = fullname
    } else {
        myName = "UnKnown"
    }
    let address = "Unknown"

    let location = Location[0]
    let parameter = "location=\(location)&latitude=\(latitude!)&longitude=\(longitude!)&name=\(namePlaceStreet.text!)&address=\(address)&profile_id=\(MYID)&fullname=\(myName)"
    request.httpBody = parameter.data(using: String.Encoding.utf8)
    session.dataTask(with:request, completionHandler: {(data, response, error) in
        if error != nil {

        } else {
            do {
                let parsedData = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as! [String:Any]
                if let Streams = parsedData["result"] as? [AnyObject] {
                    DispatchQueue.main.async {
                        for Stream in Streams {
                            if let notification = Stream["outcome"] as? String {
                                self.coordinates.isHidden = false
                                self.coordinates.text = String(notification)
                                self.submitButton.isHidden = true
                                self.namePlaceStreet.isHidden = true
                                self.topLabel.isHidden = true
                            }
                        }
                    }
                }
            } catch let error as NSError {
                print(error)
            }
        }
    }).resume()
}

标签: iosswift

解决方案


此代码是异步的,因此最好添加一个活动指示器开始操作并在成功/错误中将其删除,或者禁用按钮

@IBAction func submitAction(_ sender: UIButton) {

   guard sender.isEnabled else { return } // in case for a messy outlet connection

   sender.isEnabled = false 

   .....

    DispatchQueue.main.async {
      sender.isEnabled = true
    }
}

多次单击它是预期的 UX,因此您需要处理它


推荐阅读