Скользкая прокрутка на 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.
Это гарантирует, что вы делаете минимальное количество обращений к серверу, необходимое для снижения нагрузки на сеть пользователя.
Пользовательский интерфейс прерывается, и ваши пользователи могут прокручивать свое приложение без этой случайности.
Я думаю, что ваш код прав насчет 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)
}
}