完成处理程序调用太晚

Posted

技术标签:

【中文标题】完成处理程序调用太晚【英文标题】:Completion Handler called too late 【发布时间】:2015-02-11 16:05:24 【问题描述】:

我正在尝试用通过DataTaskWithURL 调用获取的数据填充UITableView。但是,tableviewcompletion handler 启动之前就已经加载了。

我搜索了这个问题并找到了将其移至主线程的方法,但这似乎不起作用。关于如何在表格视图加载之前将其移动到正确的队列的任何想法?

我的代码:

    var jsonData: JSON = []

func getRequestForTableView() 

    let urlPath = "[URL]"
    let url: NSURL = NSURL(string: urlPath)!
    let session = NSURLSession.sharedSession()
    let task = session.dataTaskWithURL(url, completionHandler: data, response, error -> Void in

        let json = JSON(data: data)

        println(json.count)
        self.jsonData = json
    )
    task.resume()

【问题讨论】:

在完成处理程序结束时重新加载表视图(但在主线程上重新加载)。 ...并在获取数据时显示进度视图,或提供一些其他反馈以让用户知道正在发生的事情 假设self.jsonData 是您的数据源。在此completionHandler 的最后一行调用dispatch_async(dispatch_get_main_queue()) self.tableView.reloadData() 谢谢,我试过了,成功了! 【参考方案1】:

需要先检查响应代码和您的数据。响应码如 200。如果有你要找的东西,你需要在确认你的响应后在你的块中重新加载 TableView。

确保您正确解释 TableView 中的数据。

重新加载 TableView // Swift

dispatch_async(dispatch_get_main_queue(),  () -> Void in
    self.tableView.reloadData()
)

响应代码 // ios

if ([response statusCode] == 200) 
           //reload table here             

【讨论】:

嗨 Chetan,我不完全理解你的建议。您能否提供一个代码示例?

以上是关于完成处理程序调用太晚的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET 4.5 自定义验证属性。 IsValid() 调用太晚了

为啥我的完成处理程序永远不会被调用?

未调用dismissViewController 完成处理程序

发出调用快速完成处理程序关闭的问题

第二次调用函数时未调用 Swift 完成处理程序

没有为 ASWebAuthenticationSession 调用会话完成处理程序