如何在获取数据完成时(在Swift中)隐藏我的UIRefreshControl?

时间:2016-03-20 13:09:05

标签: ios swift uitableview alamofire uirefreshcontrol

我有一个UITableView,最近我添加了一个拉动刷新功能。

到目前为止代码看起来像这样:

fetchRequests()

正如您所看到的,我在刷新控制功能中调用了一个函数fetchRequests(),我也在那里设置了attributesTitle以显示用户上次更新的时间。

我的函数func fetchRequests(){ Alamofire.request(.GET, "https://mywebservice", parameters: ["username": username]) .responseJSON { response in switch response.result { case .Success: self.items.removeAllObjects() if let jsonData = response.result.value as? [[String: AnyObject]] { for requestJSON in jsonData { if let request = SingleRequest.fromJSON(JSON(requestJSON)){ self.items.addObject(request) dispatch_async(dispatch_get_main_queue(),{ self.tview.reloadData() self.refreshControl?.endRefreshing() self.currentDate = NSDate() }) } } } //self.tview.reloadData() case .Failure(let error): print("SWITCH ERROR") print(error) } } } 调用web服务并以异步方式获取数据:

self.refreshControl?.endRefreshing()

我想在刷新完成后隐藏refreshControl。

这一行:

success
fetchRecords中//self.tview.reloadData() 案例内部的

不起作用。如何从那里引用refreshControl并在成功的情况下结束它?另外,目前我在fetchRecords的末尾注释掉了这一行:

dispatch_async

因为我相信/希望重新加载发生在<b>内 - 这是一个很好的假设吗?

2 个答案:

答案 0 :(得分:1)

你在做错的是你的refreshControl对象是本地的,只在viewDidLoad中可用,所以即使你在fetchRequest()中使用它也行不通。将refreshControl对象传递给fetchRequests函数。尝试下面的事情:

func refresh(refreshControl: UIRefreshControl) {
refreshControl.attributedTitle = NSAttributedString(string: "last updated on \(currentDate)")
fetchRequests(refreshControl)
}

func fetchRequest(refreshControl: UIRefreshControl) {
  //existing code....
     dispatch_async(dispatch_get_main_queue(),{
                            self.tview.reloadData()
                            refreshControl?.endRefreshing()
                            self.currentDate = NSDate()
                        })
}

如果在func refresh(refreshControl:UIRefreshControl)中移动你的enter fetchRequests func也会有效。

答案 1 :(得分:0)

虽然服务正在后台线程上调用,但您无法刷新UI。当你得到响应时,然后在dispatch_get_main_queue内部进行解析和Userinteface更改。

func fetchRequests(){
    Alamofire.request(.GET, "https://mywebservice", parameters: ["username": username])
        .responseJSON { response in
dispatch_async(dispatch_get_main_queue(),{
            switch response.result {
            case .Success:

                self.items.removeAllObjects()
                if let jsonData = response.result.value as? [[String: AnyObject]] {
                    for requestJSON in jsonData {
                        if let request = SingleRequest.fromJSON(JSON(requestJSON)){
                            self.items.addObject(request)

                                self.tview.reloadData()
                                self.refreshControl?.endRefreshing()
                                self.currentDate = NSDate()


                        }
                    }
                }
                //self.tview.reloadData()

            case .Failure(let error):
                print("SWITCH ERROR")
                print(error)
            }

    }
})
}