UITableView在UITableView上滚动显示URL的图像
问题描述:
我的表格视图在滚动时起伏不定,当它加载cellForItemAtIndexPath
函数中的每个图像时,我已经通过一些示例进行了搜索,这些是我尝试过的和仍然有同样的问题。UITableView在UITableView上滚动显示URL的图像
所以我有这个
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
}
所以你可以看到我使用的调度异步函数来获取图像,即使我有和无的它仍然不流畅。
有没有人有关于此的任何解决方案?谢谢!
答
所以问题在于,每次显示UITableView时都要从URL调用图像。每次单元退出屏幕并返回时,它都会调用该方法从服务器中检索图像。
当UI尝试执行时,服务器调用正在执行,这包括滚动和其他视觉负载。
根据应用程序的不同,您可以在加载tableView并将其存储在本地之前下载UITableView的所有图像。我也会调查NSCache
,因为这可能对您的应用程序更好。
目标是让用户界面始终成为头号优先事项。因此,如果您需要在UITableView中加入UITableView,请在载入UITableView之前加载它们或从内存中调用它们。
这可以确保您可以减少用户网络负载所需的最少量的服务器调用。
用户界面中断,用户可以通过他们的应用程序滚动而不会发生这种琐事。
答
我认为你的代码是正确的关于异步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)
}
}
你说得对。这是一个长期的解决方案,虽然直到我找到如何做到这一点,但至少数据只在开始时加载一次,所以我想以一种好方法。虽然谢谢你的指导! –
如果你不想在本地存储,只是每次加载ViewController时加载它们,你可以使用'UIActivityIndicatorView'向用户显示你正在从服务器加载数据,然后才能正式呈现UITableView。 – ggworean
您认为在图像实际显示在单元格中之前显示一个默认图像(或加载图像)是个不错的主意?我想现在它变得更好了! –