我有一个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>
内 - 这是一个很好的假设吗?
答案 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)
}
}
})
}