何时在UITableView

时间:2015-07-25 16:30:06

标签: ios json swift uitableview alamofire

问题:使用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加载速度更快
  • 在填充表格视图单元格之前,暂停时间为1秒。

我尝试将新请求函数放在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秒。

在我实现缓存之前,我需要弄清楚如何(以及在​​何处)正确地发出我的请求。任何人都可以帮助我吗?

0 个答案:

没有答案