在 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.xibPostCell.xib 并相应地加载它们。

这样当你的视图在数据设置之前被加载时,它会显示一个很好的消息,表明数据正在加载。

【讨论】:

这没有多大意义。如果你返回0 如果allPosts.count0,那么你需要做的就是return allPosts.count 是否为零。如果它确实返回0,那么cellForRowAt 甚至不会被调用,所以没有什么需要调整的。

以上是关于在 Swift 中使用远程 JSON 数据填充 tableView的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中使用 JSON 对象填充表视图

如何在 Swift 3 中用 JSON 数据填充表格?

在 Swift 2 和 Xcode 7 中使用来自 youtube 视频的 JSON 数据填充 UITableView

将 swift 数组解析为有效的 json

使用 Json 图像 URL 调用 swift 填充 UITableView

ios swift 2如何用json数据填充uipickerview [重复]