Ios 何时在UITableView上重新加载数据()
问题:使用Alamofire和SwiftyJSON填充Ios 何时在UITableView上重新加载数据(),ios,json,swift,uitableview,alamofire,Ios,Json,Swift,Uitableview,Alamofire,问题:使用Alamofire和SwiftyJSON填充UITableView时,会加载表格视图,但在显示数据之前会有1秒的暂停。我不确定应该在哪里调用reloadData()来修复此问题 关于何时使用Alamofire和SwiftyJSON调用reloadData()来填充UITableView,存在各种各样的问题,但我还没有找到解决问题的答案 一点背景: 我正在使用Google Places Web API用Google地名、地址和图标填充UITableView。最初我只是使用SwiftyJS
UITableView
时,会加载表格视图,但在显示数据之前会有1秒的暂停。我不确定应该在哪里调用reloadData()
来修复此问题
关于何时使用Alamofire和SwiftyJSON调用reloadData()
来填充UITableView
,存在各种各样的问题,但我还没有找到解决问题的答案
一点背景:
我正在使用Google Places Web API用Google地名、地址和图标填充UITableView
。最初我只是使用SwiftyJSON来完成这项工作,但加载UITableView
需要相当长的时间。下面是一些代码:
GooglePlacesRequest.swift
:
...
var placesNearbyArray: [GooglePlaceNearby]?
if let url = NSURL(string: urlString) {
if let data = NSData(contentsOfURL: url, options: .allZeros, error: nil) {
let json = JSON(data: data)
placesNearbyArray = parseNearbyJSON(json)
completion(placesNearbyArray)
} else {
completion(placesNearbyArray)
}
} else {
completion(placesNearbyArray)
}
}
func parseNearbyJSON(json: JSON) -> [GooglePlaceNearby] {
var placesNearbyArray = [GooglePlaceNearby]()
for result in json["results"].arrayValue {
let name = result["name"].stringValue
let address = result["vicinity"].stringValue
...
placesNearbyArray.append(place)
}
return placesNearbyArray
}
...
var placesNearbyArray: [GooglePlaceNearby]?
request(.GET, urlString).responseSwiftyJSON({ (_, _, json, error) in
var innerPlacesArray = [GooglePlaceNearby]()
for result in json["results"].arrayValue {
let name = result["name"].stringValue
let address = result["vicinity"].stringValue
...
innerPlacesArray.append(place)
}
placesNearbyArray = innerPlacesArray
completion(placesNearbyArray)
})
completion(placesNearbyArray)
}
而视图中的代码将出现在UITableView
中:
覆盖功能视图将出现(动画:Bool){
placesRequest.getPlacesNearUserLocation(location, completion: { (googlePlaces) -> Void in
if let googlePlaces = googlePlaces {
self.venues = googlePlaces
}
dispatch_async(dispatch_get_main_queue(), { () -> Void in
self.tableView.reloadData()
})
})
}
正如我上面所说的,这种方法是可行的,但是加载UITableView
通常需要3-4秒。然后我决定使用Alamofire、SwiftyJSON和(可能的)缓存
以下是当前代码的一些片段:
GooglePlacesRequest.swift
:
...
var placesNearbyArray: [GooglePlaceNearby]?
if let url = NSURL(string: urlString) {
if let data = NSData(contentsOfURL: url, options: .allZeros, error: nil) {
let json = JSON(data: data)
placesNearbyArray = parseNearbyJSON(json)
completion(placesNearbyArray)
} else {
completion(placesNearbyArray)
}
} else {
completion(placesNearbyArray)
}
}
func parseNearbyJSON(json: JSON) -> [GooglePlaceNearby] {
var placesNearbyArray = [GooglePlaceNearby]()
for result in json["results"].arrayValue {
let name = result["name"].stringValue
let address = result["vicinity"].stringValue
...
placesNearbyArray.append(place)
}
return placesNearbyArray
}
...
var placesNearbyArray: [GooglePlaceNearby]?
request(.GET, urlString).responseSwiftyJSON({ (_, _, json, error) in
var innerPlacesArray = [GooglePlaceNearby]()
for result in json["results"].arrayValue {
let name = result["name"].stringValue
let address = result["vicinity"].stringValue
...
innerPlacesArray.append(place)
}
placesNearbyArray = innerPlacesArray
completion(placesNearbyArray)
})
completion(placesNearbyArray)
}
添加此项后,我尝试使用视图中的相同代码将出现在UITableView
中,但实际情况如下:
UITableView
加载速度更快
- 然后,在填充表格视图单元格之前会暂停1秒
我已尝试将新的请求函数放置在UITableView
的不同位置,例如viewDidLoad
:
override func viewDidLoad() {
super.viewDidLoad()
...
let placesRequest = PlacesRequest()
placesRequest.fetchNearbyPlaces(location, completion: { (googlePlaces) -> Void in
if let googlePlaces = googlePlaces {
self.venues = googlePlaces
}
dispatch_async(dispatch_get_main_queue(), { () -> Void in
self.tableView.reloadData()
})
}
)
我还尝试在主线程上调用viewWillLoad
和viewwillbeen
中的reloadData()
结果总是一样的。UITableView
加载数据之前会有1秒的暂停
在实现缓存之前,我需要弄清楚如何实现(以及在哪里实现)要正确地提出我的请求。有人能帮我吗?您是否尝试过使用时间档案器。当发生延迟时,它通常会指示哪个函数/调用占用了太多的时间。此外,根据单元格的复杂性,重新加载数据总是会有延迟。每次您调用它时,它都会计算单元格的高度,并将差异放在在单元格中的不同元素中,请确保在tableVIew indexPath单元格函数之外放入尽可能多的代码。为了确保,您的问题是重新加载数据花费的时间太长,对吗?是的,这是正确的,reloadData()
直到加载表视图后大约1秒才完成执行。我将尝试使用时间分析器。我将使用带时间(以毫秒为单位)的multiple prinln()检查什么时候是方法调用的。但是延迟可能是正常的,因为1.加载结果需要时间,2.准备单元格需要时间。为什么不缓存JSON结果?并向用户显示最后一次缓存的结果?并给用户重新加载数据的可能性?但在代码中,您从Web服务获取数据,然后reload(填充)表。因此1秒应该是正常的(从Web服务获取数据)是的,正如我在问题中所说的,我要采取的下一步是实现缓存。我正在考虑使用HanekeSwift或仅使用NSCache
。