json - 更改 JSON 响应上的按钮可见性时滞后

标签 json swift uibutton

在成功的 JSON 请求后,我希望更改界面中某些按钮的可见性。但是,当我按照下面描述的方式处理它时,由于某种原因我遇到了巨大的滞后。打印语句在每个状态调用中​​都经过,但按钮本身的可见性甚至在长达 30 秒的时间内都不会改变。

func buttonStateOne() {
    self.executeButton.isHidden = false
    self.clearButton.isHidden = false
    self.stopButton.isHidden = true
    self.greyExecuteButton.isHidden = true
    self.greyClearButton.isHidden = true
    self.greyStopButton.isHidden = false
    self.drawUIView.isUserInteractionEnabled = true
    print("On state one")
}

func buttonStateTwo() {
    self.executeButton.isHidden = true
    self.clearButton.isHidden = true
    self.stopButton.isHidden = true
    self.greyExecuteButton.isHidden = false
    self.greyClearButton.isHidden = false
    self.greyStopButton.isHidden = false
    self.drawUIView.isUserInteractionEnabled = false
    print("On state two")
}

func buttonStateThree() {
    self.executeButton.isHidden = true
    self.clearButton.isHidden = true
    self.stopButton.isHidden = false
    self.greyExecuteButton.isHidden = false
    self.greyClearButton.isHidden = false
    self.greyStopButton.isHidden = true
    self.drawUIView.isUserInteractionEnabled = false
    print("on state three")
}

@IBAction func sendLines() {
        self.buttonStateTwo()

        // Draw a path
        let theDrawView: DrawView = drawView as! DrawView
        var pathPoints = [Any]()
        for line in theDrawView.lines {
           pathPoints.append([line.start.x, line.start.y])
        }

        // Send the path
        let json: [String: Any] = [ "path": pathPoints ]
        let jsonData = try? JSONSerialization.data(withJSONObject: json)
        var request = URLRequest(url: URL(string: "http://localhost:5000/path")!)
        request.httpMethod = "POST"
        request.httpBody = jsonData
        request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type")
        let task = URLSession.shared.dataTask(with: request) { data, response, error in
            guard let data = data, error == nil else {
                print(error?.localizedDescription ?? "No data")
                return
            }
            var responseString: String = ""
            let responseJSON = try? JSONSerialization.jsonObject(with: data, options: [])
            if let responseJSON = responseJSON as? [String: String] {
                print(responseJSON["status"]!)
                responseString = responseJSON["status"]!
            }
            if responseString == "SUCCESS" {
                self.buttonStateThree()
            } else {
                self.buttonStateOne()
            }
        }
        task.resume()

    }

最佳答案

UI 必须在主线程上更新,因此将包含 buttonState... 方法的 block 分派(dispatch)到主线程:

DispatchQueue.main.async {
   if responseString == "SUCCESS" {
       self.buttonStateThree()
   } else {
       self.buttonStateOne()
   }
}

关于json - 更改 JSON 响应上的按钮可见性时滞后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45948621/

相关文章:

ios - ScrollView 中 UIButton 的动画

swift - 快速录制按钮的 Flash 动画问题

javascript - 在 Node.js 中将 log4j 错误流解析为 JSON

mysql - 如何将 SQL 查询结果转换/复制为 JSON?

mysql - 安装 Vapor/MySQL 后无法不带参数调用类型 'posix_spawn_files_actions_t' 的初始值设定项

arrays - 类型 'Any' 没有下标成员 - NSMutableArray

ios - 什么是通过 Enum 进行可重用 UIAlertController 配置的 Swift 最佳实践

ios - UIButton - 设置属性并在按下按钮时使用它

php - 如何将 Eloquent 关系包含到 JSON 转换结果中?

javascript - 在响应中发回 JSON 对象(不是字符串版本)