使用 Firebase 存储下载时内存泄漏
Memory Leak when using Fire Base Storage Download
我有一个程序有两个选项卡,每个选项卡 运行 都有自己的视图控制器。第二个选项卡是一个显示按钮的基本屏幕,而第一个选项卡是一个 UICollectionView
,显示几个 UICollectionViewCell
,其中有一个图像和一个标签。
从 UICollectionView
选项卡切换到另一个选项卡时,我似乎有非常大的内存泄漏。我已经确定两个视图控制器都正确命中 deinit
,并且我的 UICollectionViewCell
s 也在去初始化,所以我认为问题在于我如何提取数据。似乎 firebase 调用及其图像 returns 从未被释放。
谁能帮我弄清楚我做错了什么?
UICollectionViewCell
定义如下
class InteractionViewCell: UICollectionViewCell {
@IBOutlet weak var Photo: UIImageView!
var Id:String?
@IBOutlet weak var personLabel: UILabel!
func configure(_ person:Person) {
self.Id = person:Person.id
FirebaseInstance.GetPersonProfilePicture(person.id) { image in
self.Photo.image = image
}
}
}
而GetPersonProfilePicture
是:
class FirebaseInstance {
static private let StorageInst:StorageReference = Storage.storage().reference()
static var StorageRef:StorageReference = StorageInst
static private let ImageMaxSize = Int64(1 * 1024 * 1024)
static func GetPersonProfilePicture(_ userUID:String, completion: @escaping (UIImage) -> Void) {
StorageRef.child("\(userUID)").getData(maxSize: ImageMaxSize) { data, error in
if let error = error {
print(error.localizedDescription)
return
} else {
let downloadedImage = UIImage(data: data!)
completion(downloadedImage!)
}
}
}
编辑:如果我删除保存个人资料图片的行,内存泄漏就会消失,这进一步证明内存泄漏似乎与我下载图像的方式有关。
提前致谢!
啊!我想到了。它实际上与我下载图像的方式完全无关。
我的问题是我通过在 Cloud Firestore
中的 collection
上调用 .addSnapshotListener
来检索单元格。但是,我从来没有删除监听器,这意味着我的 UICollectionView
从未被取消初始化,这导致了巨大的内存泄漏。
通过在第一个控制器的 viewWillDisapper
中调用 mySnapshotListener.remove()
,我能够摆脱内存泄漏。
我有一个程序有两个选项卡,每个选项卡 运行 都有自己的视图控制器。第二个选项卡是一个显示按钮的基本屏幕,而第一个选项卡是一个 UICollectionView
,显示几个 UICollectionViewCell
,其中有一个图像和一个标签。
从 UICollectionView
选项卡切换到另一个选项卡时,我似乎有非常大的内存泄漏。我已经确定两个视图控制器都正确命中 deinit
,并且我的 UICollectionViewCell
s 也在去初始化,所以我认为问题在于我如何提取数据。似乎 firebase 调用及其图像 returns 从未被释放。
谁能帮我弄清楚我做错了什么?
UICollectionViewCell
定义如下
class InteractionViewCell: UICollectionViewCell {
@IBOutlet weak var Photo: UIImageView!
var Id:String?
@IBOutlet weak var personLabel: UILabel!
func configure(_ person:Person) {
self.Id = person:Person.id
FirebaseInstance.GetPersonProfilePicture(person.id) { image in
self.Photo.image = image
}
}
}
而GetPersonProfilePicture
是:
class FirebaseInstance {
static private let StorageInst:StorageReference = Storage.storage().reference()
static var StorageRef:StorageReference = StorageInst
static private let ImageMaxSize = Int64(1 * 1024 * 1024)
static func GetPersonProfilePicture(_ userUID:String, completion: @escaping (UIImage) -> Void) {
StorageRef.child("\(userUID)").getData(maxSize: ImageMaxSize) { data, error in
if let error = error {
print(error.localizedDescription)
return
} else {
let downloadedImage = UIImage(data: data!)
completion(downloadedImage!)
}
}
}
编辑:如果我删除保存个人资料图片的行,内存泄漏就会消失,这进一步证明内存泄漏似乎与我下载图像的方式有关。
提前致谢!
啊!我想到了。它实际上与我下载图像的方式完全无关。
我的问题是我通过在 Cloud Firestore
中的 collection
上调用 .addSnapshotListener
来检索单元格。但是,我从来没有删除监听器,这意味着我的 UICollectionView
从未被取消初始化,这导致了巨大的内存泄漏。
通过在第一个控制器的 viewWillDisapper
中调用 mySnapshotListener.remove()
,我能够摆脱内存泄漏。