仅在JSON之后加载tableView

时间:2018-12-13 14:46:02

标签: json swift uitableview

我意识到在JSON完成块中调用了tableView.reloadData()以用接收到的数据重新加载tableView;我想知道是否只有在此完成块完成后才能加载tableView。发生的情况是,tableView首先使用默认单元格为空,然后几秒钟后,在完成块内调用reloadData()方法,并且tableView重新加载,并且数据与自定义单元格一起出现。我只想在收到数据时和之后加载tableView。我可以采取什么方法?有没有一种方法只能在完成后加载视图?我基本上不想让用户在空白表上看到几秒钟,然后等待数据出现。这是我的viewController代码和用于保存数据模型的简单结构。

viewController:

    import UIKit

class ViewController: UIViewController, UITableViewDataSource {

    var users = [User]()
    @IBOutlet weak var tableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        guard let url = URL(string: "https://jsonplaceholder.typicode.com/users") else { return }
        URLSession.shared.dataTask(with: url) { (data, response, error) in
            do {
                guard let data = data else { return }
                let recieved = try JSONDecoder().decode([User].self, from: data)
                self.users = recieved
                DispatchQueue.main.async {
                    self.tableView.reloadData()
                }
            } catch let error as NSError {
                print("Error: \(error.description)")
            }
        }.resume()
    }

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

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! TableViewCell
        cell.name.text = users[indexPath.row].name
        cell.eMail.text = users[indexPath.row].email
        return cell
    }
    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

}

结构:

    struct User: Decodable {

    let id: Int
    let name: String
    let username: String
    let email: String
    let company: Company

}

    struct Company: Decodable {

    let name: String
    let catchPhrase: String
    let bs: String

}

3 个答案:

答案 0 :(得分:0)

由于您实际上是在等待网络呼叫才能显示数据,所以为什么不在表格视图顶部的视图上显示微调框或活动指示器,然后在成功解析数据后将其关闭(或处理任何错误)。另一种选择是在将视图加载到另一个类之前请求数据。

答案 1 :(得分:0)

我认为您可以在UITableView中添加活动指示器。因此,用户将不会仅看到空白的UITableView。或者,您可以在UITableView中添加背景图像,如果数据仍然为空,则可以显示它,并在JSON解码后将其隐藏。

有关UITableView中的参考背景图像,您可以看到here

答案 2 :(得分:0)

根据您的建议;这是我使用activityIndi​​cator采取的路线。我在tableView上设置了一个UIView,然后在该UIView上添加了一个activityIndi​​cator,并且还在activityIndi​​cator旁边添加了一个简单的UILabel,字符串为“ Loading”。在接收到数据并重新加载tableView之后,我在JSON任务中使用了propertyAnimator,然后停止activityIndi​​cator,使UIView褪色以显示tableView,然后从superView中删除UIView。这是代码:

import UIKit

class ViewController: UIViewController, UITableViewDataSource {

splices

}