2017-02-28 53 views
0

我在我的視圖控制器中極度緩慢地使用標籤。視圖控制器中的標籤填充非常慢

該腳本發送一個用戶標識到一個PHP腳本。腳本檢索數組中與用戶標識相關的數據,並將其作爲json響應發回給我的應用程序。然後,我的視圖控制器中的標籤將填充來自json數組(字典)的相應數據。

「do {}」中的打印語句會立即在控制檯中執行,但viewcontroller中的標籤數量會過長。將self.lblStreet.text = self.loadedStreet放在{}之外,但仍然在任務中,它會給出相同的緩慢結果。

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

回答

1

更新主線程上的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() 
} 
} 
0

除了主線程外,不應該編輯UI。您可以使用此代碼獲取主線程以實現UI更新。

dispatch_async(dispatch_get_main_queue(), ^{ 
    // Update UI stuff here 
}); 
相關問題