使用json数据填充tableView

时间:2016-08-31 07:39:18

标签: ios iphone swift

我对IOS编程非常陌生,我只是在下面的代码工作正常,但我无法知道这里的控制流程。

  • 质疑

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

2)numberOfSectionsInTableView()和tableView(:,cellForRowAtIndexPath indexPath :)执行的次数和次数是多少次?

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

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

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

    }
}

3 个答案:

答案 0 :(得分:0)

答案 -

  1. 您正在异步地将数据放入表ID中。这就是为什么print语句将被执行(表ID为空时)和表ID被填充时的意思。

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

  3. 对于3.和4.我建议尝试同步执行这些任务并查看更改。你会了解自己。

答案 1 :(得分:0)

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

  

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

     

收到响应后将执行响应块并重新加载表。

     

因此,在getCotnactsListJSON()获取响应之前,print(tableID)已经执行。

2)numberOfSectionsInTableView()和tableView(:,cellForRowAtIndexPath indexPath :)执行的次数和次数是多少次?

  

它会自动执行,如果View Controller中有一个表,这些方法将用于该表。

     

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

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

  

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

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

  

如果要在第一次加载时显示数据,则必须在数组中定义数据,即必须使用某些数据初始化数组。

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

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

并评论方法:

//getContactListJSON()

答案 2 :(得分:0)

答案 - 1:

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

答案 - 2:

numberofsections and numberofrows执行一次,但每次滚动时cellforrowatindexpath都会执行,因为它会对单元格(即resue cell)进行deque以获得更好的性能和内存效率

答案 - 3:

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

答案 - 4:

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

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