在swift get memory警告中加载本地gif

时间:2018-02-18 06:24:59

标签: ios swift gif

我有一个可扩展的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

1 个答案:

答案 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
}