我对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
}
}
答案 0 :(得分:0)
答案 -
您正在异步地将数据放入表ID中。这就是为什么print语句将被执行(表ID为空时)和表ID被填充时的意思。
this。此外,如果您更好奇,那么只需在这些方法中添加print语句,并查看它们的调用方式和时间。
对于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的一些教程,以及它的数据源和委托方法,异步网络调用,主线程等。!