使用Swift在TableView中显示JSON数据

时间:2015-12-01 10:19:10

标签: ios json swift uitableview

我正在尝试将从数据库中获取的一些数据显示为TableView,但数据未显示在TableView中。我收到的数据格式为JSON。

这是我从数据库收到的数据以及我想在TableView中打印的内容只是David:

{"name":"David"}

这是从de data base获取数据的代码:

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方法中打印的方法,但数据没有打印在{{1 }}

我认为问题是在我将数据放入TableView之前绘制了TableView因此它没有打印因为数组是空的,我不知道如何修复它。

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

1 个答案:

答案 0 :(得分:1)

是的,你是对的。

  

session.dataTaskWithRequest

是异步的。数据不会立即返回,它有延迟。 您必须在收到数据后重新加载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()
    }
}

更好