UITableView 在使用 SwiftyJSON 和 Alamofire 从 API 返回数据之前渲染
UITableView got rendered before data from API returned using SwiftyJSON and Alamofire
当我在 viewDidLoad() 中调用 callapi() 函数时,callapi 中的 println() 会打印其中包含 Post 对象的 posts 数组,但是 viewDidLoad() 函数中的 println() 会打印一个空数组。此外,当我构建项目时,我收到此错误 "fatal error: Array index out of range"。 tableView 函数中的 println() 语句也打印一个空数组。 table 似乎在 API 的数据到达之前就已呈现 我该如何解决这个问题?
var posts = [Post]()
override func viewDidLoad() {
super.viewDidLoad()
callapi()
println(self.posts)
}
func callapi(){
request(.GET, "url")
.responseJSON { (request, response, data, error) in
let json = JSON(data!)
if let jsonArray = json.array {
for post in jsonArray {
var onepost = Post(id:post["id"].stringValue,
title:post["title"].stringValue,
author:post["author"].stringValue,
post:post["post"].stringValue,
created_on:post["created_on"].stringValue,
updated_on:post["updated_on"].stringValue)
self.posts.append(onepost)
println(self.posts)
self.tableView.reloadData()
}
}
}
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath
indexPath: NSIndexPath) -> UITableViewCell {
let cellIdentifier = "Cell"
let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier,
forIndexPath: indexPath) as! CustomTableViewCell
println(self.posts)
let post = self.posts[indexPath.row]
// Configure the cell...
cell.titleLabel!.text = self.posts[indexPath.row].title
cell.postLabel.text = post.post
println(self.posts)
return cell
}
确保将 tableView:numberOfRowsInSection: 设置为 return self.posts.count
当 viewDidLoad
被调用时,它启动了异步 callapi
,但是当 viewDidLoad
完成时,posts
仍然是空的。但是 table 视图仍将继续其初始加载过程,即使 posts
尚未填充,因此您必须确保 tableView:numberOfRowsInSection:
return 为零这点。
稍后,callapi
完成 Alamofire GET
请求并调用 reloadData
。只有在这一点上应该 tableView:numberOfRowsInSection:
return 非零值。
最重要的是,确保 tableView:numberOfRowsInSection:
return 是 posts
中的实际条目数,问题应该得到解决。
只需在 viewDidAppear 中插入重新加载即可:
override func viewDidAppear(animated: Bool) {
self.tableView.reloadData()
}
当我在 viewDidLoad() 中调用 callapi() 函数时,callapi 中的 println() 会打印其中包含 Post 对象的 posts 数组,但是 viewDidLoad() 函数中的 println() 会打印一个空数组。此外,当我构建项目时,我收到此错误 "fatal error: Array index out of range"。 tableView 函数中的 println() 语句也打印一个空数组。 table 似乎在 API 的数据到达之前就已呈现 我该如何解决这个问题?
var posts = [Post]()
override func viewDidLoad() {
super.viewDidLoad()
callapi()
println(self.posts)
}
func callapi(){
request(.GET, "url")
.responseJSON { (request, response, data, error) in
let json = JSON(data!)
if let jsonArray = json.array {
for post in jsonArray {
var onepost = Post(id:post["id"].stringValue,
title:post["title"].stringValue,
author:post["author"].stringValue,
post:post["post"].stringValue,
created_on:post["created_on"].stringValue,
updated_on:post["updated_on"].stringValue)
self.posts.append(onepost)
println(self.posts)
self.tableView.reloadData()
}
}
}
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath
indexPath: NSIndexPath) -> UITableViewCell {
let cellIdentifier = "Cell"
let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier,
forIndexPath: indexPath) as! CustomTableViewCell
println(self.posts)
let post = self.posts[indexPath.row]
// Configure the cell...
cell.titleLabel!.text = self.posts[indexPath.row].title
cell.postLabel.text = post.post
println(self.posts)
return cell
}
确保将 tableView:numberOfRowsInSection: 设置为 return self.posts.count
当 viewDidLoad
被调用时,它启动了异步 callapi
,但是当 viewDidLoad
完成时,posts
仍然是空的。但是 table 视图仍将继续其初始加载过程,即使 posts
尚未填充,因此您必须确保 tableView:numberOfRowsInSection:
return 为零这点。
稍后,callapi
完成 Alamofire GET
请求并调用 reloadData
。只有在这一点上应该 tableView:numberOfRowsInSection:
return 非零值。
最重要的是,确保 tableView:numberOfRowsInSection:
return 是 posts
中的实际条目数,问题应该得到解决。
只需在 viewDidAppear 中插入重新加载即可:
override func viewDidAppear(animated: Bool) {
self.tableView.reloadData()
}