iOS быстрая производительность UITableView ReloadData

Мой вызов 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()
}

Если кто-то хочет увидеть какой-либо другой код, пожалуйста, дайте мне знать. Спасибо заранее за любую помощь.


person George M Ceaser Jr    schedule 19.04.2015    source источник
comment
Вы заявляете, что загружаете данные из API, редактируете ли вы пользовательский интерфейс в обработчике завершения вызова данных? Если вы это сделаете, вы deck основной поток?   -  person milo526    schedule 19.04.2015
comment
Я использую делегат в своем классе ViewModel и вызываю метод делегата, когда все данные загружены и загружены в объекты. Этот делегат вызывает функцию перезагрузки страницы. Таким образом, насколько мне известно, все это выполняется в основном потоке. Я обновил вопрос своим вызовом API и кодом делегата на случай, если я что-то упустил.   -  person George M Ceaser Jr    schedule 20.04.2015
comment
Попробуйте удалить очередь из основного потока, прежде чем вызывать функцию делегата в вашем NearLocationGet.   -  person milo526    schedule 20.04.2015
comment
Я не понимаю, что вы имеете в виду, когда говорите о переходе в основной поток перед вызовом функции делегата в NearLocationGet. Не могли бы вы привести пример, чтобы указать на документацию по нему?   -  person George M Ceaser Jr    schedule 21.04.2015


Ответы (1)


Итак, я провел некоторое исследование ответа milo526 и обнаружил, что изменение вызова моего делегата следующим образом, похоже, решило проблему.

            //Switch back to main thread
            dispatch_async(dispatch_get_main_queue()) { ()
                self.iobj_LocationAPICompleteDelegate?.LocationAPIComplete()
            }

Я предполагаю, что мой большой комментарий/утверждение сейчас - никто никогда не должен публиковать примеры использования NSURLSession.sharedSession() с dataTaskWithURL, не обращаясь к переключению потоков, необходимому в закрытии. :)

person George M Ceaser Jr    schedule 21.04.2015