Скользкая прокрутка на UITableView, отображающая изображения с URL

У меня проблема с тем, что мое табличное представление прерывисто при прокрутке, когда оно загружает каждое изображение внутри функции cellForItemAtIndexPath Я просмотрел несколько примеров, и это то, что я пробовал, и до сих пор имею ту же проблему.

Итак, у меня есть это

var arrRes = [[String:AnyObject]]()

Тогда вид изнутри загрузил я делаю Alamofire GET запрос и с swiftyJSON я сохраняю файл json в приведенном выше словаре.

if let resData = swiftyJsonVar["events"].arrayObject {
  self.arrRes = resData as! [[String:AnyObject]]
}
self.tableview2.reloadData()




func numberOfSectionsInTableView(tableView: UITableView) -> Int {

    return 1

}


func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    return arrRes.count
}



func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCellWithIdentifier("mapCell", forIndexPath: indexPath) as! locationEventsTableViewCell

    var dict = arrRes[indexPath.row]

    cell.eventTitle.text = dict["eventName"] as? String

    let cal = dict["eventStarttime"] as? String



    let dateF = NSDateFormatter()
    dateF.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
    let date:NSDate = dateF.dateFromString(cal!)!


    let d = NSDateFormatter()

    d.dateFormat = "dd-MM-yyyy HH:mm"
    let d1 = d.stringFromDate(date)
    cell.eventDate.text = d1
    let at = dict["eventStats"]?["attendingCount"] as? Int
    let kapa = at?.stringValue
    cell.eventAttends.text = kapa
    let imageDef : UIImage = UIImage(named: "noimage")!


    let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT
    dispatch_async(dispatch_get_global_queue(priority, 0)) {
    if let theImage = dict["eventCoverPicture"] as? String {

        let url = NSURL(string: theImage)

        if url != nil {
            let data = NSData(contentsOfURL: url!)
            dispatch_async(dispatch_get_main_queue()) {
            cell.eventImage.image = UIImage(data: data!)

            }

        } else {
            cell.eventImage.image = imageDef
        }


    }
    }



    return cell

}

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

У кого-нибудь есть решение по этому поводу? Спасибо!

2 ответа

Решение

Таким образом, проблема заключается в том, что вы вызываете изображения с URL-адреса каждый раз, когда отображается ваш UITableView. Каждый раз, когда ячейка выходит за пределы экрана и возвращается, она вызывает метод для получения изображения с сервера.

Серверные вызовы выполняются во время выполнения пользовательского интерфейса, включая прокрутку и другие визуальные загрузки.

В зависимости от приложения вы можете загрузить все изображения для UITableView, прежде чем загружать tableView и сохранять их локально. Я бы тоже посмотрел NSCache как это может быть лучше для вашего приложения.

Цель состоит в том, чтобы пользовательский интерфейс всегда был приоритетом номер один. Так что если есть вещи, которые должны быть в UITableView, как ваш eventCoverPictureзагрузите их или вызовите их из памяти перед загрузкой UITableView.

  1. Это гарантирует, что вы делаете минимальное количество обращений к серверу, необходимое для снижения нагрузки на сеть пользователя.

  2. Пользовательский интерфейс прерывается, и ваши пользователи могут прокручивать свое приложение без этой случайности.

Я думаю, что ваш код прав насчет Async API. возможно, NSDateFormatter замедляет вас. Форматер даты - это сложный API. Используйте запоминание, это также улучшит производительность.

class MyObject {

    // define static variable

    private static let formatter: NSDateFormatter = {
        let formatter = NSDateFormatter()
        formatter.dateFormat = "EEE MMM dd HH:mm:ss Z yyyy"
        return formatter
    }()

    // you could use it like so

    func someMethod(date: NSDate) -> String {

        return MyObject.formatter.stringFromDate(date)
    }
}
Другие вопросы по тегам