iOS - Firebase存储下载非常缓慢

4
我正在使用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()   
        }
    }
}

文件有多大?你正在使用哪种类型的网络下载它?因特网速度很可能是你最大的瓶颈。特别是在移动设备上,这会相当受限。 - Frank van Puffelen
这个文件并不太大,只是一个普通的 iPhone 照片。有没有办法在我切换屏幕时强制停止方法的执行?或者有没有任何方法可以加快这个过程? - Alex
我和我们的一些工程师核实了一下。最好的办法是你上传到GCS服务器的往返时间慢。你无法改变这个情况。虽然我们也无法改变往返速度(或者说带宽),但是我们正在研究优化这种情况的方法。对于下载,你可以尝试使用下载库(比如SDWebImage)从下载链接下载文件,看看是否解决了问题。 - Frank van Puffelen
2个回答

1
这可能是以下因素的组合:a)您要下载的数据有多大,b)您所在的网络类型,c)您所在的位置,以及d)您对“缓慢”定义的内容。 :)
话虽如此,“普通的 iPhone 照片”确实非常大 - 例如,iPhone 6s 拍摄的照片为 4032 x 3024。我猜想你的 imageView 要小得多。因此,一种建议是在上传到 Firebase Storage 之前根据最终需要的图像大小调整图像大小。
我还同意 Frank 的观点,使用 downloadURL 和类似 SDWebImage、PINRemoteImage 或 AlamoFireImage 的库可能是一个好主意。这些库负责重要任务,如在非主线程上加载、缓存和通常不会在目标 imageView 突然消失时崩溃。

-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() 

   }
 })

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接