Swift 3 中的 Firebase 存储图像持久性
Posted
技术标签:
【中文标题】Swift 3 中的 Firebase 存储图像持久性【英文标题】:Firebase Storage image persistence in Swift 3 【发布时间】:2017-08-30 07:26:18 【问题描述】:我使用this tutorial 将数据添加到 Firebase。它完美地工作。由于快照和持久性,它也可以离线工作。
我还从this link 向 Firebase 存储添加了图像。这也有效,但不适用于持久性。我试图从数据中复制快照(第一个教程)来做到这一点,但据我所知,FIRStorageReference 没有快照选项。我该怎么做?
import Foundation
import Firebase
import FirebaseStorage
struct MenuItemImage
let image: NSData
let ref: FIRStorageReference?
let key: String
init(image: NSData, key: String = "")
self.key = key
self.image = image
self.ref = nil
init(snapshot: FIRDataSnapshot) // this should be something like FIRStoreSnapshot
key = snapshot.key
let snapshotValue = snapshot.value as! [String: AnyObject]
image = snapshotValue["image"] as! NSData
ref = snapshot.ref // errors as cannot assign value of tupe FIRDatabaseReference to type FIRStorageReference
func toAnyObject() -> Any
return [
"image": image
]
【问题讨论】:
您能否详细说明“图像持久性”的含义? 当然,对于普通数据(字符串),我使用的代码会创建一个数组,即使设备处于离线状态,该数组仍将保存字符串。 Firebase 的行为类似于 NSUserDefaults 或核心数据。没有任何实际设置。但是图像存储在 Firebase 的不同区域中,因此当设备离线时,字符串仍会出现,但图像已消失(数组为空) Firebase 存储和 Firebase 数据库是两种不同的产品。 Firebase 数据库 SDK 可以为您处理磁盘持久性。 Firebase 存储 SDK 没有。要缓存从 Firebase Storage 获取的图像,您通常会使用第三方库。请参阅以下任何一项:***.com/… 是的,您需要缓存图像。您可以创建自己的缓存扩展。参考这个视频:youtu.be/GX4mcOOUrWQ 【参考方案1】:使用 FirebaseUI/Storage:添加到您的 Podfile
:
pod 'FirebaseUI/Storage'
然后,在您的代码中,显示和缓存图像:
import FirebaseStorageUI
let imgRef = Storage.storage().reference().child("images/\(blah)")
myImageView.sd_setImage(with: imgRef))
就是这样!如果使用相同的引用,图像将在后台获取,并缓存以备下次使用。
【讨论】:
很好的解决方案。这样我们就不需要先下载 firebase 存储 url,然后将此 url 与图像缓存库一起使用。【参考方案2】:Kingfisher 工作得非常好,谢谢,但是我现在确实遇到了一些问题,它现在速度很慢(请参阅单独的线程)
Kingfisher with Firebase storage slow to display images - swift 3
哦,我通过在结构中包含一个空白 imageURL 来修复快照,然后在图像保存到 FirebaseStorage 时写入它。这意味着该结构在带有 URL 的快照中返回
【讨论】:
以上是关于Swift 3 中的 Firebase 存储图像持久性的主要内容,如果未能解决你的问题,请参考以下文章
Swift 3:tableView 复制从 Firebase 加载的图像
可以从 Swift 中的 firebase 在浏览器中看到的图像的 URL