Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 何时在UITableView上重新加载数据()_Ios_Json_Swift_Uitableview_Alamofire - Fatal编程技术网

Ios 何时在UITableView上重新加载数据()

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

问题:使用Alamofire和SwiftyJSON填充
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