viewcontroller 中的标签填充速度非常慢
Labels in viewcontroller are populated very slow
我正在为 viewcontroller 中的标签填充速度极慢而苦苦挣扎。
该脚本将用户 ID 发送到 php 脚本。脚本检索与数组中的用户 ID 相关的数据,并将其作为 json 响应发送回我的应用程序。然后我的 viewcontroller 中的标签填充了 json 数组(字典)中的相应数据。
"do{}" 中的打印语句会立即在控制台中执行,但 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。 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()
}
}
我正在为 viewcontroller 中的标签填充速度极慢而苦苦挣扎。
该脚本将用户 ID 发送到 php 脚本。脚本检索与数组中的用户 ID 相关的数据,并将其作为 json 响应发送回我的应用程序。然后我的 viewcontroller 中的标签填充了 json 数组(字典)中的相应数据。
"do{}" 中的打印语句会立即在控制台中执行,但 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。 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()
}
}