2017-02-02 9 views
0

Я начал изучать разработку IOS с помощью swift 3.0.i, созданного простым приложением для вызова web api для запроса данных из базы данных сервера. Я могу получить данные json и проанализировать его в строковый массив. приложение может печатать массив, но оно не может отображаться в представлении таблицы. это несколько раз смутило меня, и я искал несколько примеров и ответов в Интернете, но все равно не мог его решить. Мои коды, как показано ниже:swift 3.0: tableview не может отображать данные, полученные в виде JSON через web api

class LocationTableViewController: UITableViewController { 

var names: [String] = [] 

override func viewDidLoad() { 
    super.viewDidLoad() 

    //——————————————————————————get the data from web api and using json parsing———————————————————————— 
    let config = URLSessionConfiguration.default // Session Configuration 
    let session = URLSession(configuration: config) // Load configuration into Session 
    let url = URL(string: "http://XXXXXXX/api/mylocations")! 

    let task = session.dataTask(with: url, completionHandler: { 
     (data, response, error) in    
     if error != nil {     
      print(error!.localizedDescription)     
     } else {     
      do {      
       var jsonResult: NSMutableArray = NSMutableArray() 
       let jsonArray = try JSONSerialization.jsonObject(with: data!, options:JSONSerialization.ReadingOptions.allowFragments) as! NSArray 
       jsonResult = jsonArray.mutableCopy() as! NSMutableArray      
       var jsonElement: NSDictionary = NSDictionary()      

       for i in 0..<jsonResult.count {       
        jsonElement = jsonResult[i] as! NSDictionary     
        if let name = jsonElement["Name"] as? String      
        { 
         // print(id) 
         // print(name) 
         // print(address) 
         // print(latitude) 
         // print(longitude) 
         // print("-------") 
         self.names.append(name) 
        }             
        // self.tableView.reloadData() 
        // print(self.names) 
       }      
       print(self.names) 
       // can print the string array data like [“name1”,”name2”,”name3”]      
      } catch {      
       print("error in JSONSerialization")      
      } 
     }    
    }) 

    task.resume()   
    //-------------- ——— result is [] it seems the above code didn't put the string array to names.—————————————— 
    print(self.names) 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
} 

override func numberOfSections(in tableView: UITableView) -> Int { 
      return 1 
} 

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return names.count; 
} 

internal override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> 
    UITableViewCell { 
    let cellIdentifier = "cell" 
    let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: 
    indexPath as IndexPath) as UITableViewCell 
     // Configure the cell... 
    cell.textLabel?.text = names[indexPath.row] 
    return cell  

    } 
} 

Может кто-нибудь помочь мне посмотреть?

+2

Просьба очистить отправленный код, удалить все прокомментированный код, бесполезный 'didReceiveMemoryWarning', меньше пустых строк, поэтому читателю это проще для чтения. – Alistra

ответ

1

Put self.tableView.reloadData() после печати print(self.names).

+0

Я попытался поставить self.tableView.reloadData(), но все еще не работал. Благодаря! – user7505698

+2

@ user7505698 Попробуйте перезагрузить tableView в основной теме. 'DispatchQueue.main.async {self.tableView.reloadData()}' –

+0

это на главной очереди это решение – muescha

0

В точке, где вы комментировали ...

результат [], кажется, приведенный выше код не ставил массив строк в имена

Эта строка кода выполняется до Данные были загружены в обработчик завершения, поэтому мы не ожидали увидеть что-либо здесь. Вы заметите, что это -, работающий с другим принтом, который у вас есть в обработчике завершения.

tableView.reloadData() в конце обработчика завершения должен работать.

Вы уверены, что у вас есть верно настроенные делегаты для tableView? Что вы видите, если вы закомментировать задачу загрузки, а просто установить

names = ["Tom", "Dick", "Harry"] 

в viewDidLoad? Если это не сработает, это проблема с делегатами.