我目前使用以下(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()
存储在应用中本地?这些下载网址是终身固定的吗?是否以某种方式自动失效?
1( 函数 getMetadata(( 是否每次联系后端 叫?因此,这可以引入往返Web服务调用吗? 延迟?
是的,这是因为下载 URL 可能已更改(例如,开发人员撤销了它(,因此我们需要再次获取它。
请注意,我们有一个 downloadURL(( 方法可以执行相同的操作,但无需手动解析元数据。
2( 如果是这样...为避免这种情况,最好将返回的存储存储 上传图像时,URL 在元数据中返回 Firebase putData(( 本地在应用程序中?这些下载网址是固定的吗 一辈子?是否以某种方式自动失效?
我建议使用FirebaseUI与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)