用Swift在TableView中显示JSON数据

我想显示一些数据,我从一个数据库到一个TableView但数据不显示在TableView 。 我收到的数据格式化为JSON格式。

这是我从数据库中获得的数据,我想在TableView打印的只是David:

 {"name":"David"} 

这是从数据库中获取数据的代码:

 let session = NSURLSession.sharedSession() let request = NSURLRequest(URL: NSURL(string: "http://localhost:8888/Patients.php")!) let task = session.dataTaskWithRequest(request) {data, response, downloadError in if let error = downloadError { print("Could not complete the request \(error)") } else { do { self.json = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.AllowFragments) } catch { fatalError() } dispatch_async(dispatch_get_main_queue(), { if let parseJSON = self.json{ let name = parseJSON["name"] as! String self.arrayData.append(name) print("Data1:\(self.arrayData)") } }) } } task.resume() 

arrayData是一个array ,我把我从数据库中得到的数据放在这里,它是这样声明的:

 var arrayData: [String] = [] 

代码

 print("Data1:\(self.arrayData)") 

在控制台中显示这个Data1:["David"] ,所以我得到正确的数据。

然后我实现了在“TableView”, numberOfSectionsInTableView方法, numberOfRowsInSection方法和cellForRowAtIndexPath方法中打印的方法,但是数据不会打印在TableView

我认为问题是,我把数据放入array之前绘制TableView ,所以它没有打印任何东西,因为数组是空的,我不知道如何修复它。

任何人都知道我的问题是什么?

你是对的。

session.dataTaskWithRequest

是asynchronous的。 数据不会立即返回,它有延迟。 您必须在收到数据后重新加载tableview:

 self.arrayData.append(name) self.tableview.reloadData() 

通常我会用block:

 func getData(handleComplete:((arr:NSMutableArray)->())){ let aray = NSMutableArray() let session = NSURLSession.sharedSession() let request = NSURLRequest(URL: NSURL(string: "http://localhost:8888/Patients.php")!) let task = session.dataTaskWithRequest(request) {data, response, downloadError in if let error = downloadError { print("Could not complete the request \(error)") } else { do { self.json = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.AllowFragments) } catch { fatalError() } dispatch_async(dispatch_get_main_queue(), { if let parseJSON = self.json{ let name = parseJSON["name"] as! String aray.append(name) print("Data1:\(self.arrayData)") } handleComplete(aray) }) } } task.resume() arrayData } 

并在viewdidload我会打电话给:

 override func viewDidLoad() { super.viewDidLoad() self.getData { (arr) -> () in self.tableview.reloadData() } } 

这样更好