我目前使用以下(Swift 4)代码下载存储在Firebase存储中的图像:
func getImage(completion: @escaping (UIImage?)->()) {
let ref = Storage.storage().reference().child("myImage.jpg")
ref.getMetadata() {
(metadata, error) in
guard let url = metadata?.downloadURLs?.first, error == nil else {
print(String(describing: error))
completion(nil)
return
}
//got url download image here and return it
//this function is not important but it does it asynchroniously
func downloadImageOrReturnACachedVersionOfItBy(url, completion)
}
即使downloadImageOrReturnACachedVersionOfItBy(...)
实际负责图片兑现,我也注意到下载图片时出现了相当大的延迟
问题:
函数getMetadata()
每次调用时都会联系后端吗?
因此,这可以引入往返Web服务调用延迟吗?
如果是这样的话......为了避免这种情况,在上传图片时,存储返回的网址是一个好主意,是否会在应用中本地Firebase putData()
的元数据中返回?这些下载网址终身是否已修复?是否会以某种方式自动失效?
答案 0 :(得分:0)
1)函数getMetadata()每次都会联系后端 叫什么名字?因此,这可以引入一个往返Web服务调用 延迟?
是的,这是因为下载网址可能已更改(例如开发者已撤消),因此我们需要再次提取。
请注意,我们有downloadURL() method执行相同的操作,但您无需手动解析元数据。
2)如果是这样......为了避免这种情况,将退回的商店存储起来是个好主意 url,上传图片时,从元数据中返回 Firebase putData()在应用程序中本地?这些下载网址是否已修复 终身?是否会以某种方式自动失效?
我建议使用FirebaseUI integration with SDWebImage,它会自动缓存并显示这些图片。
// Reference to an image file in Firebase Storage
let reference = storageRef.child("images/stars.jpg")
// UIImageView in your ViewController
let imageView: UIImageView = self.imageView
// Placeholder image
let placeholderImage = UIImage(named: "placeholder.jpg")
// Load the image using SDWebImage
imageView.sd_setImage(with: reference, placeholderImage: placeholderImage)