2017-04-18 116 views
1

我在視圖控制器中有一個表,該視圖控制器通過字典進行填充,字典中通過JSON請求檢索信息。在viewDidLoad()功能,我認爲這種檢索被添加到`IncompletedDeadlines字典中的數據的功能:表僅在交互時顯示,而不是默認情況下

override func viewDidLoad() { 
    super.viewDidLoad() 

    self.IncompleteDeadlines = [String:AnyObject]() 
    self.retrieveIncompletedDeadlines() 
} 

一切不過只是在工作表中顯示時互動。我想,也許,以顯示錶出現在視圖中的時刻是通過添加tableView.reloadviewDidAppear爲所以最好的辦法:

override func viewDidAppear(_ animated: Bool) { 
    self.tableView.reloadData() 
} 

但這不能解決問題。爲了清晰起見,我附上了照片。圖片一顯示視圖出現的時刻。一旦表格與互動,圖片2只發生。所以我的問題是如何讓表格立即顯示?據我所知,可能是因爲負載的延遲,但我不應該與它交互爲它顯示:

http://imgur.com/a/0bgTB

當視圖被交互即刷卡:

retrieveIncompletedDeadlines()函數爲這樣:

func retrieveIncompletedDeadlines(){ 
    let myUrl = NSURL(string: "https://www.example.com/scripts/retrieveIncompleteDeadlines.php"); 
    let request = NSMutableURLRequest(url:myUrl! as URL) 
    let user_id = UserDetails[0] 
    request.httpMethod = "POST"; 
    let postString = "user_id=\(user_id)"; 
    request.httpBody = postString.data(using: String.Encoding.utf8); 

    let task = URLSession.shared.dataTask(with: request as URLRequest) { 
     data, response, error in 

     if error != nil { 
      print("error=\(String(describing: error))") 
      return 
     } 

     var err: NSError? 
     do { 
      let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary 
      if let parseJSON = json { 
       let checker:String = parseJSON["status"] as! String; 

       if(checker == "Success"){ 
        let resultValue = parseJSON["deadlines"] as! [String:AnyObject] 
        self.IncompleteDeadlines = resultValue 
       } 
       self.tableView.reloadData() 
      } 
     } catch let error as NSError { 
      err = error 
      print(err!); 
     } 
    } 
    task.resume(); 
    self.tableView.reloadData() 
} 
+0

可以顯示'self.retrieveIncompletedDeadlines()'?你在哪裏得到json? – mat

+0

它是,我已經加了它 – Nouman

+0

我還是看不到它 – mat

回答

2

JSON將被解析在後臺線程,但任何更新的UI必須在主線程上完成,因此您必須在DispatchQueue.main.async {}內完成此article解釋了什麼是問題。

此外,我會寫一個完成處理程序,該操作完成後返回數據。這是另一個有趣的article

Completion handlers are super convenient when your app is doing something that might take a little while, like making an API call, and you need to do something when that task is done, like updating the UI to show the data.

var incompleteDeadlines = [String:AnyObject]() 
override func viewDidLoad() { 
    super.viewDidLoad() 
    //please note your original function has changed 
    self.retrieveIncompletedDeadlines { (result, success) in 
     if success { 
      // once all the data has been parsed you assigned the result to self.incompleteDeadlines 
      self.incompleteDeadlines = result 
      DispatchQueue.main.async { 
       self.tableView.reloadData() 
      } 
     } 
    } 
} 

func retrieveIncompletedDeadlines(_ completion:@escaping ([String:AnyObject] , _ success: Bool)-> Void){ 
    let myUrl = NSURL(string: "https://www.example.com/scripts/retrieveIncompleteDeadlines.php"); 
    let request = NSMutableURLRequest(url:myUrl! as URL) 
    let user_id = UserDetails[0] 
    request.httpMethod = "POST"; 
    let postString = "user_id=\(user_id)"; 
    request.httpBody = postString.data(using: String.Encoding.utf8); 

    let task = URLSession.shared.dataTask(with: request as URLRequest) { 
     data, response, error in 

     if error != nil { 
      print("error=\(String(describing: error))") 
      return 
     } 

     var err: NSError? 
     do { 
      let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary 
      if let parseJSON = json { 
       let checker:String = parseJSON["status"] as! String; 
       var resultValue = [String:AnyObject]() 
       if(checker == "Success"){ 
        resultValue = parseJSON["deadlines"] as! [String:AnyObject] 
       } 

        completion(resultValue, true) 
      } 
     } catch let error as NSError { 
      err = error 
      print(err!); 
     } 
    } 
    task.resume(); 
} 
} 
+0

AH完美!它已經成功了,一旦定時器啓動,我會接受。謝謝! ;)+你是如何表示完成處理程序返回數據? – Nouman

+0

請參閱更新的答案。我做了一些改變,確保一切都在正確的地方。 – mat

+0

我還沒有測試,但它應該工作;) – mat

相關問題