我正在为我的应用使用Firebase Storage。在我的应用中,用户有个人资料,可以上传个人资料照片,然后当他们将来点击他们的个人资料时,它应该下载并显示他们的个人资料照片。问题是,当我上传和下载照片时,会出现明显的延迟,并且看起来代码没有运行。对于下载,我在我的ViewWillAppear()
中进行了呼叫,但是即使在屏幕加载并且我点击其他内容后它仍继续运行。我怎样才能加快速度呢?不仅延迟很烦人,而且当我移动到另一个视图或注销并且ViewWillAppear()
中的代码仍在运行时,它会导致崩溃。
override func viewWillAppear(bool: Bool) {
var retPic : UIImage
let storage = FIRStorage.storage()
let storageRef = storage.referenceForURL("gs://project-xxxxxxxxxxx.appspot.com")
let profPicRef = storageRef.child("images/" + (FIRAuth.auth()?.currentUser?.uid)! + ".jpg")
// Download in memory with a maximum allowed size of 1MB (1 * 1024 * 1024 bytes)
profPicRef.dataWithMaxSize(1 * 4096 * 4096) { (data, error) -> Void in
if (error != nil) {
print(error)
} else {
// Data for "images/island.jpg" is returned
print("This is delayed")
self.retPic = UIImage(data: data!)!
self.imageView.image = self.retPic
print("still here")
self.imageView.reloadInputViews()
}
}
}
答案 0 :(得分:1)
它很可能是a的组合:a)你尝试下载的数据有多大,b)你在哪种网络上,c)你在哪里?重新定位,和d)你对"慢"的定义是什么?是。 :)
那说,一张普通的iPhone照片"真的是怪异的'例如,iPhone 6s可以拍摄4032 x 3024的照片。我的猜测是你的imageView比这个要小得多。因此,有一项建议是根据您认为最终需要的图片大小,在上传 之前调整图片大小。
我同意Frank的看法,将downloadURL
与SDWebImage
,PINRemoteImage
或AlamoFireImage
这样的库结合使用可能是一个好主意。这些库负责处理重要任务,例如加载主线程,缓存,如果目标imageView突然消失,通常不会崩溃。
答案 1 :(得分:-1)
将NSData转换为UIImage时应使用后台线程,或者您可以获取图像URL并使用Kingfisher pod。我更喜欢第二种选择。
Swift3版本:
import Kingfisher
profPicRef.downloadURL(completion: { (url, error) in
if error != nil {
print(error)
}
else{
let retPicUrl = (url?.absoluteString)! as String
self.imageView.kf.setImage(with: URL(string: retPicUrl)!)
self.imageView.reloadInputViews()
}
})