2017-08-29 46 views
0

成功的JSON请求时,我希望更改某些按钮在我的界面中的可见性。但是,当我按照下面描述的方式处理它时,出于某种原因,我会遇到很大的滞后。 print语句在每个状态调用中​​都会发生,但是按钮本身的可见性不会像最多30秒那样改变。在JSON响应中更改按钮可见性时出现延迟

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() 

    } 
+0

[NSURLSession完成处理程序很慢(HTTPS的可能重复:// stackoverflow.com/questions/35029692/nsurlsession-completion-handler-very-slow) – nathan

回答

1

的UI必须更新在主线程调度使包括buttonState...方法,主线程块:

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