【发布时间】:2017-05-21 05:11:17
【问题描述】:
我想用远程 JSON 数据填充 tableView。获取在 fetchRecentPosts 方法中完成,并在 viewDidLoad 方法中调用。问题是 dataTaskWithRequest 是异步的,表视图不等待数据。我在What is the time delay between getting data and loading to UITableView 中读到我应该在 dispatch_async 中写 self.tableView.reloadData() 但它没有用。
func fetchRecentPosts(){
let url = XAPI.recentPostURL()
let request = NSURLRequest(URL: url)
let task = session.dataTaskWithRequest(request){
(data, response, error) -> Void in
let result = self.processRecentPostsRequest(data: data, error: error)
allPosts = result
print("session task complete")
}
dispatch_async(dispatch_get_main_queue(),{
self.tableView.reloadData()
})
task.resume()
}
问题是 allPosts 为 nil,因为 dataTaskWithRequest 还没有完成它的任务。
致命错误:在展开可选值时意外发现 nil
override func viewDidLoad() {
super.viewDidLoad()
fetchRecentPosts()
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return allPosts.count
}
【问题讨论】:
-
联网是一种异步操作。正确的做法是在
dataTaskWithRequest回调中收到数据后填充表格视图。 -
将
dispatch_async移动到任务的完成块内。 -
先指定 JSON 对象,它的数组对象或字典,然后用 NSObject 模态类解析。重新加载 UItableView 之后,将这些对象添加到 allPosts 数组中。
标签: ios json swift uitableview