【问题标题】:Labels in viewcontroller are populated very slowviewcontroller 中的标签填充速度非常慢
【发布时间】:2017-07-19 19:37:20
【问题描述】:

我的视图控制器中的标签填充速度极慢。

脚本将用户 ID 发送到 php 脚本。脚本在数组中检索与用户 ID 相关的数据,并将其作为 json 响应发送回我的应用程序。然后我的 viewcontroller 中的标签将填充 json 数组(字典)中的相应数据。

“do{}”中的打印语句会立即在控制台中执行,但视图控制器中标签的填充需要很长时间。将 self.lblStreet.text = self.loadedStreet 放在 do{} 之外,但仍在任务中,它给出了同样缓慢的结果。

class CharDetailViewController: UIViewController {

//Outlets
@IBOutlet weak var lblUID: UILabel!
@IBOutlet weak var lblStreet: UILabel!

//URL to our web service
let URL_GET_DETAILS = "http://somesite.com/script.php"

var passedUID: String!
var loadedStreet: String!

override func viewDidLoad() {
    super.viewDidLoad()

    let url = URL(string: URL_GET_DETAILS)
    lblUID.text = passedUID

    let request = NSMutableURLRequest(url: url! as URL)
    request.httpMethod = "POST";
    let sendUID = lblUID.text
    let postParameters = "sendUID="+sendUID!;
    request.httpBody = postParameters.data(using: String.Encoding.utf8)
    let task = URLSession.shared.dataTask(with:request as URLRequest){
        data, response, error in

        if error != nil{
            print("error is \(error)")
            return;
        }

        do{
        let myJSON =  try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary
        if let parseJSON = myJSON {
            var uid : String!
            uid = parseJSON["userid"] as! String?

            self.loadedStreet = parseJSON["street"] as! String!     
            self.lblStreet.text = parseJSON["street"] as! String!

            print(uid)
            print(self.loadedStreet)
         }     
    }
    catch {
        print(error)
        }
    }     
    task.resume()
}
override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}
}

【问题讨论】:

    标签: ios json swift3 uilabel populate


    【解决方案1】:

    您不应该在主线程以外的任何地方编辑 UI。您可以使用此代码获取主线程以实现 UI 更新。

    dispatch_async(dispatch_get_main_queue(), ^{
        // Update UI stuff here
    });
    

    【讨论】:

      【解决方案2】:

      在主线程上更新您的 UI。 URLSession 让您处于后台线程中。 Swift 3 中的相应代码是

      DispatchQueue.main.async {
          //your UI code
      }
      

      所以你的代码应该看起来更像这样。

      class CharDetailViewController: UIViewController {
      
       //Outlets
      @IBOutlet weak var lblUID: UILabel!
      @IBOutlet weak var lblStreet: UILabel!
      
      //URL to our web service
      let URL_GET_DETAILS = "http://somesite.com/script.php"
      
      var passedUID: String!
      var loadedStreet: String!
      
      override func viewDidLoad() {
          super.viewDidLoad()
      
          let url = URL(string: URL_GET_DETAILS)
          lblUID.text = passedUID
      
          let request = NSMutableURLRequest(url: url! as URL)
          request.httpMethod = "POST";
          let sendUID = lblUID.text
          let postParameters = "sendUID="+sendUID!;
          request.httpBody = postParameters.data(using: String.Encoding.utf8)
          let task = URLSession.shared.dataTask(with:request as URLRequest){
               data, response, error in
      
               if error != nil{
                   print("error is \(error)")
                   return;
               }
      
               do{
               let myJSON =  try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary
      
               if let parseJSON = myJSON {
                   var uid : String!
                   uid = parseJSON["userid"] as! String?
      
                  DispatchQueue.main.async {
                    //your UI code
                    self.loadedStreet = parseJSON["street"] as! String! 
                    self.lblStreet.text = parseJSON["street"] as! String!
                  }
      
                 print(uid)
                 print(self.loadedStreet)
              }     
          }catch {
           print(error)
          }
       }     
          task.resume()
       }
      
       override func didReceiveMemoryWarning() {
         super.didReceiveMemoryWarning()
       }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-04
        • 1970-01-01
        • 2012-02-25
        • 2016-10-10
        • 2012-11-05
        • 2016-03-12
        相关资源
        最近更新 更多