ios - 使用 Swift 在 TableView 中显示 JSON 数据

标签 ios json swift uitableview

我正在尝试将从数据库中获取的一些数据显示到 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 是一个数组,我把从数据库接收到的数据放在其中,声明如下:

var arrayData: [String] = []

代码

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

在控制台中显示此 Data1:["David"],以便我正确获取数据。

然后我在“TableView”、numberOfSectionsInTableView 方法、numberOfRowsInSection 方法和 cellForRowAtIndexPath 方法中实现打印方法,但是数据未打印在 TableView 中。

我认为问题是 TableView 是在我将数据放入 array 之前绘制的,所以它什么都不打印,因为数组是空的,而我没有知道如何修复它。

谁知道我的问题是什么?

最佳答案

是的,你是对的。

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()
    }
}

更好

关于ios - 使用 Swift 在 TableView 中显示 JSON 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34017897/

相关文章:

ios - "Saved photo"在用户允许照片库权限之前弹出警报?

iphone - 如何为现有PDF文件设置所有者密码?

jquery - 循环 JSON 数据

java - 属性 "thenComparing": 的 setter 定义冲突

javascript - Node.js 从二维 JSON 数组中获取行

swift - textDidChange 指向错误的 NSCollectionViewItem

ios - 当我在 xcode 中构建项目时,出现类似 clang 错误 :input files not found 的错误

ios - UINavigationBar 背景颜色不显示为纯色

swift - 选择和取消选择 UICollectionview 以启用按钮

Swift 4 协议(protocol)扩展 - 便利初始化器默认实现