2016-07-22 42 views
1

我的表格视图在滚动时起伏不定,当它加载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 

} 

所以你可以看到我使用的调度异步函数来获取图像,即使我有和无的它仍然不流畅。

有没有人有关于此的任何解决方案?谢谢!

回答

1

所以问题在于,每次显示UITableView时都要从URL调用图像。每次单元退出屏幕并返回时,它都会调用该方法从服务器中检索图像。

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

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

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

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

  2. 用户界面中断,用户可以通过他们的应用程序滚动而不会发生这种琐事。

+0

你说得对。这是一个长期的解决方案,虽然直到我找到如何做到这一点,但至少数据只在开始时加载一次,所以我想以一种好方法。虽然谢谢你的指导! –

+0

如果你不想在本地存储,只是每次加载ViewController时加载它们,你可以使用'UIActivityIndi​​catorView'向用户显示你正在从服务器加载数据,然后才能正式呈现UITableView。 – ggworean

+0

您认为在图像实际显示在单元格中之前显示一个默认图像(或加载图像)是个不错的主意?我想现在它变得更好了! –

1

我认为你的代码是正确的关于异步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) 
    } 
}