在Swift中使用远程JSON数据填充tableView

时间:2017-05-21 05:11:17

标签: ios json swift uitableview

我想用远程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
}

1 个答案:

答案 0 :(得分:0)

你可能会侥幸逃脱。

numberOfRowsInsection方法中,您可以检查allPosts.count的计数,如果它是0(还没有数据),则返回0,否则返回计数。

然后在cellForRowAtIndexPath代理中,您可以根据allPosts中是否有任何内容相应地调整视图。

我建议您为单元格使用xib个文件,也可以使用LoadingCell.xibPostCell.xib并相应加载它们。

这样,当您在设置数据之前加载视图时,它将显示一条指示正在加载数据的好消息。