我有这个问题大约3-4周。我用谷歌搜索,检查了一切,但仍然没有工作。请帮帮我!
在每个动态滚动cellForRowAtIndexPath
重新加载tableView
时,它会开始冻结。
cellForRowAtIndexPath
函数的表格视图如下:
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{
let cell = tableView.dequeueReusableCellWithIdentifier("cell")! as! MoviesTVC
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),{
let dictionary = self.rows[indexPath.row] as? [String: AnyObject]
dispatch_async(dispatch_get_main_queue(),{
cell.setCell(dictionary!)
})
})
return cell
}
setCell()
功能:
func setCell(dictionary: AnyObject){
let ImgString = dictionary["src"] as? String;
let ImgUrl = NSURL(string: ImgString!);
let ImgData = NSData(contentsOfURL: ImgUrl!)
self.movImg.image = UIImage(data: ImgData!);
self.movName.text = dictionary["name"] as? String;
self.movComment.text = dictionary["caption"] as? String;
}
答案 0 :(得分:3)
您在后台异步任务中使用了错误的代码。目前,您只能在后台获取阵列中的值,这是一个非常快速的过程......
您应该做的是在后台运行困难的任务,然后在前台更新UI。
let cell = tableView.dequeueReusableCellWithIdentifier("cell")! as! MoviesTVC
let dictionary = self.rows[indexPath.row] as? [String: AnyObject]
cell.setCell(dictionary!)
return cell
func setCell(dictionary: AnyObject){
let ImgString = dictionary["src"] as? String;
let ImgUrl = NSURL(string: ImgString!);
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),{
let ImgData = NSData(contentsOfURL: ImgUrl!)
let image = UIImage(data: ImgData!);
//Possibly resize the image here in the background task
//so that the cpu doesn't need to scale it in the UI thread
dispatch_async(dispatch_get_main_queue(),{
self.movImg.image = image
})
})
self.movName.text = dictionary["name"] as? String;
self.movComment.text = dictionary["caption"] as? String;
}
编辑:在评论中回答您的问题。最简单的解决方案是为每个“image”单元格的字典添加一个属性。然后,当您加载单元格时,如果字典的“image”属性存在,那么您只需将该图像加载到单元格中即可。如果它不存在,则下载并将其保存到字典中,然后将其添加到您的单元格中。
更难的解决方案是将图像下载到本地资源位置。然后使用imageNamed
从文件加载图像。这将为您处理缓存和内存释放。那将是更好的选择。
更好的方法是使用CoreData。在任何这些解决方案中,当您运行不足时,您必须管理清除文件存储。