Мой вызов ReloadData занимает более 40 секунд между фактическим вызовом ReloadData и первым вызовом функции cellForRowAtIndexPath табличного представления. Кто-нибудь знает, почему такой хит производительности?
вот код для справки: Этот код вызывается после того, как мои данные webAPI были возвращены и полностью загружены в соответствующие локальные объекты.
func reloadPage()
{
btnMenu.hidden = false
btnMapAll.hidden = false
if ApplicationMode != AppMode.Normal
{
btnUseGPS.hidden = false
}
else
{
btnUseGPS.hidden = true
}
StartTime = CACurrentMediaTime()
self.NearbyLocationsTable.reloadData()
}
Вот моя функция cellForRowAtIndexPath. Вы можете видеть, что я печатаю время в самом начале первого вызова функции.
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
if EndTime == nil
{
EndTime = CACurrentMediaTime() - StartTime!
println("cellForRowAtIndexPath Time Elapsed \(EndTime?.description)")
}
var lobj_NearbyLocationEntry: NearbyLocationsCell? = tableView.dequeueReusableCellWithIdentifier(lc_LocationCellTableIdentifier) as? NearbyLocationsCell
if(lobj_NearbyLocationEntry == nil)
{
lobj_NearbyLocationEntry = NearbyLocationsCell(style: UITableViewCellStyle.Default, reuseIdentifier: lc_LocationCellTableIdentifier)
}
lobj_NearbyLocationEntry!.ConfigureCell(gobj_NearbyLocations[indexPath.row].Title, pd_Rating: gobj_NearbyLocations[indexPath.row].Rating, ps_Distance: gobj_NearbyLocations[indexPath.row].Distance, ps_Attributes: gobj_NearbyLocations[indexPath.row].AttributesTexts, pi_RowIndex: indexPath.row)
return lobj_NearbyLocationEntry!
}
Распечатывается следующая информация: cellForRowAtIndexPath Time Elapsed Optional("40.0729780000402")
Иногда истекшее время составляет всего 12 секунд, но это все равно слишком много. Любая идея, что вызывает это?
Я реализую функцию numberOfRowsInSection. это выполняется в течение нескольких миллисекунд после вызова reloadData. Я также реализую функцию willDisplayCell, но она вызывается только после cellForRowAtIndexPath (т.е. по истечении 40 секунд).
Мы будем очень признательны за идеи или предложения.
Вот другой код:
Определение протокола/делегата:
protocol LocationAPICallDelegate
{
func LocationAPIComplete()
}
Код ViewModel:
var iobj_LocationAPICompleteDelegate: LocationAPICallDelegate?
func NearbyLocationsGet(ps_Langauge: String, pi_Day_Of_Week: Int, pd_Latitude: Double, pd_Longitude: Double, pl_CityID: Int, pi_Distance: Int, pb_Rating_For_Men: Bool, pi_NumberOfEntries: Int, pb_Location_In_Metric: Bool)
{
var ls_CompleteURL: String = ""
var ls_NSURL: NSURL
ls_CompleteURL = BuildURL(ps_Langauge, pi_Day_Of_Week: pi_Day_Of_Week, pd_Latitude: pd_Latitude, pd_Longitude: pd_Longitude, pl_CityID: pl_CityID, pi_Distance: pi_Distance, pb_Rating_For_Men: pb_Rating_For_Men, pi_NumberOfEntries: pi_NumberOfEntries, pb_Location_In_Metric: pb_Location_In_Metric)
var request : NSMutableURLRequest = NSMutableURLRequest()
ls_NSURL = NSURL(string: ls_CompleteURL)!
let urlSession = NSURLSession.sharedSession()
let jsonQuery = urlSession.dataTaskWithURL(ls_NSURL, completionHandler: { data, response, error -> Void in
if (error != nil) {
println(error.localizedDescription)
}
var err: NSError?
var jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &err) as
[[String:AnyObject]]
if (err != nil) {
println("JSON Error \(err!.localizedDescription)")
}
else
{
self.LoadJSONLocationDataToObjects(jsonResult)
self.iobj_LocationAPICompleteDelegate?.LocationAPIComplete()
}
})
jsonQuery.resume()
}
Вы можете видеть, что делегат вызывается в приведенном ниже коде ViewController.
class NearbyLocationsViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, LocationAPICallDelegate, DOWAPICallDelegate, SideBarDelegate, GPSLocationDelegate
Затем я объявляю экземпляр класса ViewModel
let iobj_NearbyLocationsVM: NearbyLocationsViewModel = NearbyLocationsViewModel()
Затем в viewDidLoad я устанавливаю делегата ViewModel на себя следующим образом:
iobj_NearbyLocationsVM.iobj_LocationAPICompleteDelegate = self
Затем функция делегата вызывается, когда все данные загружаются в ViewModel, используя следующее, которое вызывает ReloadPage
func LocationAPIComplete()
{
reloadPage()
}
Если кто-то хочет увидеть какой-либо другой код, пожалуйста, дайте мне знать. Спасибо заранее за любую помощь.
deck
основной поток? - person milo526   schedule 19.04.2015