我想用远程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
}
答案 0 :(得分:0)
你可能会侥幸逃脱。
在numberOfRowsInsection
方法中,您可以检查allPosts.count
的计数,如果它是0(还没有数据),则返回0,否则返回计数。
然后在cellForRowAtIndexPath
代理中,您可以根据allPosts
中是否有任何内容相应地调整视图。
我建议您为单元格使用xib
个文件,也可以使用LoadingCell.xib
和PostCell.xib
并相应加载它们。
这样,当您在设置数据之前加载视图时,它将显示一条指示正在加载数据的好消息。