用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() } }
这样更好