我有一个非常简单的iOS应用程序,它从firebase中提取图像,将它们添加到数组中,然后将它们放入带有url会话的集合视图中。只有一个问题,保存图像集合视图的视图是与主视图分开的视图,因此每次用户点击视图时,我都会看到内存使用情况。单击后退时,内存不会更改。每次按下视图时,内存使用量都会不断增加。在我在主视图中进行url会话之前,我从未遇到过这个问题,但现在我在单独的视图中遇到了问题。这是我下载图像的代码:
抓图片:
let ref = firdatabase.dadatabase.reference
ref.child("Pages").queryOrderedByKey.observeSingleEvent(type: .value, snapshot in
if let pages = snapshot.value as? [String : AnyObject] {
for (_, vale) in pages {
let newPage = page()
If let url = vale["url"] as? String {
newpage.url = url
pagers.append(new page)
}
}
collection view.reloadData()
)}
nsurlsession:
if pagers.count != 0 {
let post = pagers[indexPath.row].url
let url = URL(string: post!)
let session = URLSession.shared.dataTask(with: url!, completionHandler: { (data, response, error) in
if let errer = error {
print(errer.localizedDescription)
}
DispatchQueue.main.async {
cell.imageViewPage.image = UIImage(data: data!)
}
})session.resume()
}
return cell
现在问题就在这里,内存不断上升而且不会下降。
我真的需要你的帮助来找到这个问题的解决方案,因为我不知道怎么做,以前从未遇到过这个问题。谢谢。我希望有一个解决这个问题的简单方法。
答案 0 :(得分:1)
您 内存泄漏并不清楚。仅仅因为内存使用率上升并不意味着你有内存泄漏。
如果您从远程URL加载图像并将其保存在一个数组中,那么您的内存使用量将会增加。
如果您离开视图控制器并丢弃该阵列并且内存使用率下降,则表示您没有内存泄漏。
请注意,您的代码是将图像安装到表视图/集合视图单元格中,但不将它们保存在任何位置。这意味着如果用户在屏幕外滚动一个单元格,然后滚动回到它,您将再次下载它。
相反,我建议您编写代码以将图像作为文件保存到磁盘。您可以创建文件URL的哈希值并将其用作文件名。检查文件是否已在磁盘上(可能在您的应用程序的缓存目录中)并从磁盘加载(如果是这样)。如果没有,请使用URLSession下载对象,并在下载完成后将文件保存到缓存目录中的哈希文件名,然后将其安装在目标单元格中。
答案 1 :(得分:0)
我认为一旦完成以避免内存泄漏,您需要使会话任务无效
android:name="com.google.android.geo.API_KEY"