Ios viewcontroller中的标签填充速度非常慢

Ios viewcontroller中的标签填充速度非常慢,ios,json,swift3,uilabel,populate,Ios,Json,Swift3,Uilabel,Populate,我正在努力解决viewcontroller中标签数量极慢的问题 该脚本向php脚本发送用户ID。To script检索数组中与userid相关的数据,并将其作为json响应发送回我的应用程序。然后使用json数组(字典)中的相应数据填充my viewcontroller中的标签 “do{}”中的print语句会在控制台中立即执行,但是viewcontroller中标签的填充需要很长时间。将self.lblStreet.text=self.loadedStreet放在do{}之外,但仍在任务中,会

我正在努力解决viewcontroller中标签数量极慢的问题

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

“do{}”中的print语句会在控制台中立即执行,但是viewcontroller中标签的填充需要很长时间。将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()
}
}

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

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

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

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

在主线程上更新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()
 }
}

在主线程上更新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()
 }
}