我有一个可扩展的collapsalbe tableview,它在展开时会显示多个GIF文件。在某个时间,当我再次扩展多个部分时,当达到600 MB空间时,它会因内存警告而崩溃。
我的实施:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let imageView = UIImageView()
imageView.frame = CGRect(x: 0, y: 0, width: 50, height: 50)
DispatchQueue.global(qos: .background).async {
DispatchQueue.main.async {
let imageData = try! Data(contentsOf: Bundle.main.url(forResource: "compile_animatiion", withExtension: "gif")!)
//imggview.image = UIImage.gif(data: imageData)
imageView.image = UIImage.gifImageWithData(imageData)
cell.addSubview(imageView)
}
}
cell.addSubview(imageView)
}
我的代码使用的是UIImage + Gif类,你可以轻松地从git中获取它。我需要确切的技术来避免这种记忆警告。
示例来源:drive.google.com/open?id=1tlVwaOfWoAronF91YykUtDy_c0iLhAzq
答案 0 :(得分:1)
<强>改进强>:
1.避免在方法cellForRowAt
中创建无限图像视图
2.将全局gif图像数据共享给所有重用的单元格。
<强>代码强>:
private var _gifImageData:UIImage?
var gifImageData:UIImage! {
get{
if (_gifImageData != nil) {
return _gifImageData
}
else{
let imageData = try! Data(contentsOf: Bundle.main.url(forResource: "compile_animatiion", withExtension: "gif")!)
_gifImageData = UIImage.gifImageWithData(imageData)
return _gifImageData
}
}
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cellID", for: indexPath)
let tagOfGifImageView = 1283
if cell.viewWithTag(tagOfGifImageView) == nil {
let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 50, height: 50))
imageView.tag = tagOfGifImageView
imageView.image = self.gifImageData
cell.addSubview(imageView)
}
return cell
}