我正在创建一个在UICollectionView中显示来自giphy.com的gif的应用程序。
我使用专用框架 Giphy-iOS 来加载GIF和 SwiftGifOrigin 来从加载的数据创建gif。我使用以下方法将GIF的数据存储在Documents目录中以用于离线模式:
lazy var documentsPath: URL = {
return try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
}()
lazy var gifsPath: URL = {
let path = self.documentsPath.appendingPathComponent("gifs")
try? FileManager.default.createDirectory(at: path, withIntermediateDirectories: false, attributes: nil)
return path
}()
func save(data: Data, named: String) {
let path = gifsPath.appendingPathComponent(named)
(data as NSData).write(to: path, atomically: true)
}
但是,尽管操作是在后台队列中执行的,但读取数据(或转换为gif)会占用大量内存并降低应用程序性能。
DispatchQueue.global(qos: .background).async {
let image = UIImage.gif(url: someExistingPath)
DispatchQueue.main.async {
imageView.image = image
}
}
我试图从目录中读取数据而不是转换为gif,但效果相同。当我获得存储方法时,应用程序运行顺畅,因此数据加载没有问题。
即使在后台队列中,什么可能导致短暂冻结?如何以正确的方式将GIF存储到app文件夹以进行脱机?或者我如何在不冻结的情况下读取数据并创建GIF?
另外,我一次在屏幕上将GIF数量减少到2,但app仍然很小。