【问题标题】:Choppy scroll on UITableView displaying images from URLUITableView 上的不稳定滚动显示来自 URL 的图像
【发布时间】:2016-07-22 20:14:56
【问题描述】:

我的表格视图在滚动时出现断断续续的问题,而它在 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

}

所以你可以看到我正在使用调度异步函数来获取图像,即使我有它或没有它仍然不稳定。

有没有人解决这个问题?谢谢!

【问题讨论】:

    标签: ios swift uitableview swift2 dispatch-async


    【解决方案1】:

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

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

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

    我们的目标是让 UI 始终是第一要务。因此,如果 UITableView 中需要像 eventCoverPicture 这样的东西,请在加载 UITableView 之前加载它们或从内存中调用它们。

    1. 这可确保您进行最少的服务器调用以减少用户网络负载。

    2. UI 被中断,您的用户可以滚动浏览他们的应用程序而不会出现这种断断续续的情况。

    【讨论】:

    • 你是对的。这是一个长期的解决方案,直到我找到如何去做,但至少数据在开始时只加载一次,所以我猜我的方式很好。虽然谢谢你的指导!!
    • 如果您不想在本地存储,而只是在每次加载 ViewController 时加载它们,您可以使用 UIActivityIndicatorView 向用户显示您正在从服务器加载数据,然后再正式呈现UITableView.
    • 您认为在图像实际显示在单元格中之前显示一个默认图像(或加载图像)是个好主意?我认为现在它变得更好了!
    • SDWebImage 是一个很棒的库,用于处理图像 url 加载并将它们自动缓存到内存中。它还具有预取器,因此如果 tableview 可能显示的图像 url 总数一次预取所有不切实际,您可以延迟加载列表中接下来的几个单元格。还有一些方法可以接受设置占位符图像的参数
    【解决方案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)
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-08
      • 2021-09-07
      • 2017-03-27
      • 1970-01-01
      • 2014-06-04
      • 1970-01-01
      相关资源
      最近更新 更多