在 Swift 中使用远程 JSON 数据填充 tableView
Posted
技术标签:
【中文标题】在 Swift 中使用远程 JSON 数据填充 tableView【英文标题】:populating tableView with remote JSON data in Swift 【发布时间】: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 数组中。
【参考方案1】:
你也许可以通过一些小技巧逃脱。
在您的numberOfRowsInsection
方法中,您可以检查allPosts.count
的计数,如果为0(还没有数据)则返回0,否则返回计数。
然后在cellForRowAtIndexPath
委托中,您可以根据allPosts
中是否有任何内容来相应地调整视图。
我建议为您的单元格使用xib
文件,您也许可以拥有LoadingCell.xib
和PostCell.xib
并相应地加载它们。
这样当你的视图在数据设置之前被加载时,它会显示一个很好的消息,表明数据正在加载。
【讨论】:
这没有多大意义。如果你返回0
如果allPosts.count
是0
,那么你需要做的就是return allPosts.count
是否为零。如果它确实返回0
,那么cellForRowAt
甚至不会被调用,所以没有什么需要调整的。以上是关于在 Swift 中使用远程 JSON 数据填充 tableView的主要内容,如果未能解决你的问题,请参考以下文章
在 Swift 2 和 Xcode 7 中使用来自 youtube 视频的 JSON 数据填充 UITableView