【问题标题】:Populating tableView with json data使用 json 数据填充 tableView
【发布时间】:2016-08-31 16:17:35
【问题描述】:

我对 IOS 编程非常陌生,我刚刚得到以下代码工作正常,但我无法知道 这里的控制流程。

  • 怀疑

1)。在 viewDidLoad 方法中,我调用了 getContactListJSON() 方法,在我打印了 tableID 之后,它正在打印空数组,为什么?

2) numberOfSectionsInTableView() 和 tableView(:, cellForRowAtIndexPath indexPath:) 执行的时间和次数?

3)。在 getContactListJSON() 方法中,我正在重新加载 tableView,因为它已经加载了一次,为什么?和

4)。如何在不使用 tableView.reloadData() 的情况下仅在第一次加载时在 tableView 上显示数据?

import UIKit

class TableViewController: UITableViewController {

    var tableName = [String]()
    var tableID = [String]()
    override func viewDidLoad() {
        super.viewDidLoad()
        getContactListJSON()
        print(tableID)

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()

    }

    func getContactListJSON(){
        let urlString = "http://jsonplaceholder.typicode.com/users"
        let urlEncodedString = urlString.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)
        let url = NSURL( string: urlEncodedString!)
        var task = NSURLSession.sharedSession().dataTaskWithURL(url!) {(data, response, innerError) in
            let json = JSON(data: data)
            let contactsArray = json.arrayValue

            dispatch_async(dispatch_get_main_queue(), {
                for contacts in contactsArray
                {
                    let id = contacts["id"].stringValue
                    let name = contacts["name"].stringValue
                    println( "id: \(id) name: \(name)" )
                    self.tableName.append(name)
                    self.tableID.append(id)
                }
                dispatch_async(dispatch_get_main_queue(),{
                    self.tableView.reloadData()
                })
            })
        }
        task.resume()
    }

    // MARK: - Table view data source

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }

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


    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) 

        // Configure the cell...
        cell.textLabel?.text = tableID[indexPath.row]

        return cell

    }
}

【问题讨论】:

    标签: ios iphone swift


    【解决方案1】:

    答案——

    1. 您将数据异步放入表 ID。这就是为什么打印语句将被执行(当表 ID 为空时)并且意味着当表 ID 被填充时。

    2. this。此外,如果您更好奇,只需在这些方法中添加打印语句,然后查看它们的调用方式和时间。

    对于 3. 和 4. 我建议尝试同步执行这些任务并查看变化。你会明白自己的。

    【讨论】:

      【解决方案2】:

      答案 - 1:

      您的getContactListJSON() 方法进行asynchrounous 网络调用,我的意思是它正在从服务器获取一些数据,因此需要一些时间取决于不同的参数。 NSUrlSession 在完成网络请求后调用它的完成处理程序。所以你的tableID 在网络调用完成后获得了价值。但是你在 viewdidload 上打印它,所以它现在没有任何价值,这就是为什么它是 nil 或 null

      答案 - 2:

      numberofsections and numberofrows 执行一次,但 cellforrowatindexpath 每次滚动时都会执行,因为它是单元格(即恢复单元格)的双端队列,以获得更好的性能和内存效率

      答案 - 3:

      当您重新加载 tableview 时,它会再次调用所有数据源方法。因此,当您从服务器 git 响应时,您需要在 tableview 上显示该数据。因此,当您最终获得所有数据时,您需要调用 reload data

      答案 - 4:

      如果您的数组已准备好,我的意思是它有数据,那么您可以直接显示它。因为你需要数据来展示。因此,您必须在获取数据时重新加载 tableview。例如,如果您有一个静态数据数组,那么您可以直接显示它,但如果您的数据来自服务器,那么您必须在检索后重新加载它。

      这是一个非常广泛的概念,需要在这里解释。所以,你应该阅读苹果文档或一些关于 tableview 的教程,它的数据源和委托方法、异步网络调用、主线程等!

      【讨论】:

      • 谢谢...我一直想知道它们是如何工作的。感谢您的帮助
      • 不客气……!您应该根据堆栈溢出指南接受正确的答案,以便其他有类似问题的人可以得到帮助:)
      【解决方案3】:

      1)。在 viewDidLoad 方法中,我调用了 getContactListJSON() 方法,在我打印了 tableID 之后,它正在打印空数组,为什么?

      因为,当您调用getCotnactsListJSON() 方法时,并没有立即收到结果,请求到服务器并获取结果需要一些时间。因此,此任务是异步执行的,这意味着所有其他事件都将发生,数据将在后台获取。

      一旦收到响应响应块将被执行并重新加载表格。

      所以,在getCotnactsListJSON() 获取响应之前,print(tableID) 已经被执行。

      2) numberOfSectionsInTableView() 和 tableView(:, cellForRowAtIndexPath indexPath:) 执行的时间和次数?

      它是自动执行的,如果视图控制器中有一个表,这些方法将为该表服务。

      当 View 被加载时,它被调用,没有任何数据,一旦收到响应并重新加载表,这些方法被再次调用。每次滚动表格时,由于单元格可重用性概念,这些方法都会被调用。

      3)。在 getContactListJSON() 方法中,我正在重新加载 tableView,因为它已经加载了一次,为什么?和

      表格加载时没有任何数据,即getContactListJSON() 方法没有获取任何结果。所以桌子是空的。收到响应后,您必须重新加载表格以填充一些数据。

      4)。如何在不使用 tableView.reloadData() 的情况下仅在第一次加载时在 tableView 上显示数据?

      如果你想在第一次加载时显示数据,你已经在数组中定义了你的数据,即你必须用一些数据初始化你的数组。

      尝试初始化您的 tableID 数组,如下所示:

      var tableID:[String] = ["1","2","3","4","5"]
      

      并注释方法:

      //getContactListJSON()
      

      【讨论】:

      • 问题出在异步调用...感谢详细解释
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多