2017-02-28 4 views
0

내 viewcontroller에서 레이블의 극단적 인 느린 채우기로 고민하고 있습니다.viewcontroller의 레이블이 매우 느리게 채워집니다.

스크립트는 사용자 ID를 PHP 스크립트로 보냅니다. To 스크립트는 배열에서 사용자 ID와 관련된 데이터를 검색하여이를 내 애플 리케이션에 json 응답으로 보낸다. 그런 다음 뷰콘의 레이블에 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 
});