UITableView上的Choppy滚动显示来自URL的图像

时间:2016-07-22 20:14:57

标签: ios swift uitableview swift2 dispatch-async

我有一个问题,我的表格视图在滚动时不稳定,同时在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 个答案:

答案 0 :(得分:2)

所以问题是你每次显示UITableView时都会从URL调用图像。每次单元格离开屏幕并返回时,它会调用方法从服务器检索图像。

在UI尝试执行时正在执行服务器调用,这包括滚动和其他可视负载。

根据应用程序的不同,您可以在加载tableView之前下载UITableView的所有图像并将其存储在本地。我也会调查NSCache,因为这对您的应用可能更好。

目标是让UI始终成为头号优先事项。因此,如果需要在您的eventCoverPicture之类的UITableView中加载它们,请在加载UITableView之前加载它们或从内存中调用它们。

  1. 这可确保您减少用户网络负载所需的最少量服务器调用。

  2. 用户界面被中断,您的用户可以滚动浏览他们的应用,而不会出现这种不连贯的情况。

答案 1 :(得分:1)

我认为你的代码是关于Async api的。它可能是NSDateFormatter减慢了你的速度。日期格式化程序是一个繁重的API。使用记忆,它也会提高性能。

AudioTrack