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:Firebase 存储代码块未执行

Swift 3:tableView 复制从 Firebase 加载的图像

下载图像,然后从 Firebase Swift 3 缓存它

可以从 Swift 中的 firebase 在浏览器中看到的图像的 URL

Firebase Swift 3 使用 NSURLSession 将配置文件图像加载到 TableView

Swift 3.0 如何在 Firebase 中的父级上添加子级