问题:使用Alamofire和SwiftyJSON填充UITableView
时,表视图会加载,但在显示数据之前会有1秒的暂停。我不确定我应该在哪里调用reloadData()
来解决这个问题。
关于何时使用Alamofire和SwiftyJSON调用reloadData()
以填充UITableView
,有各种各样的问题,但我还没有找到解决问题的答案。
一些背景知识:
我正在使用Google Places Web API填充UITableView
Google地方名称,地址和图标。最初我只是使用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
}
来自viewWillAppear
的{{1}}的代码:
覆盖func viewWillAppear(animated:Bool){ ...
UITableView
正如我上面所说,这种方法很有效,但 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()
})
})
}
通常需要3-4秒才能加载。然后我决定使用Alamofire和SwiftyJSON以及(可能)缓存。
以下是当前代码的一些片段:
UITableView
:
GooglePlacesRequest.swift
添加此内容后,我尝试在 ...
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)
}
中使用viewWillAppear
中的相同代码,但这就是:
UITableView
加载速度更快我尝试将新请求函数放在UITableView
的不同位置,例如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()
})
}
)
和reloadData()
的主要主题上致电viewWillLoad
。
结果始终相同... viewWillAppear
加载数据前暂停1秒。
在我实现缓存之前,我需要弄清楚如何(以及在何处)正确地发出我的请求。任何人都可以帮助我吗?