2017-02-28 10 views
0

viewcontrollerのラベルが極端に少なくなっています。viewcontroller内のラベルの読み込みが非常に遅い

スクリプトは、ユーザーIDをPHPスクリプトに送信します。スクリプトでは、配列内のユーザーIDに関連するデータを取得し、アプリにjsonレスポンスとして返します。次に、私のviewcontrollerのラベルに、json配列(辞書)からの対応するデータが取り込まれます。

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

答えて

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 
}); 
関連する問題