ios - 三种firebase存储下载方式的区别

标签 ios swift firebase firebase-storage

我找不到讨论这三者之间区别的资源 download methods在 firebase 存储文档和每个文档的优缺点中。我想澄清一下 firebase 存储文档。

我的应用

  • 在表格 View 中显示 100 张大小在 10 KB 到 500 KB 之间的图像
  • 将在互联网连接和/或电话服务可能非常弱的地方使用
  • 可以被很多用户使用

从 Firebase 存储下载的 3 种方法

  1. 下载到内存中的NSData

    This is the easiest way to quickly download a file, but it must load entire contents of your file into memory. If you request a file larger than your app's available memory, your app will crash. To protect against memory issues, make sure to set the max size to something you know your app can handle, or use another download method.

问题:我尝试用这种方法在我的表格 View 单元格上显示 100 张大小为 10KB-500KB 的图像。虽然我的应用程序没有崩溃,但当我滚动浏览我的表格时,我的内存使用量增加到 268 MB。是否建议将此方法用于显示大量图像?

  1. 下载到代表设备上文件的 NSURL

    The writeToFile:completion: method downloads a file directly to a local device. Use this if your users want to have access to the file while offline or to share in a different app.

问题:这是否意味着来自 firebase 存储的所有图像都将下载​​到用户的手机上?这是否意味着该应用将占用手机可用存储空间的很大一部分?

  1. 在线生成代表文件的NSURL

If you already have download infrastructure based around URLs, or just want a URL to share, you can get the download URL for a file by calling the downloadURLWithCompletion: method on a storage reference.

问题:此方法是否需要强大的互联网连接和/或电话服务连接才能工作?

最佳答案

一般来说,你的内存使用不会受到检索方法的影响。只要您显示 100 张图像,它们的数据就会存储在内存中,并且如果它们的格式/压缩方式相同,则它们的大小应该相同。

无论采用哪种方式,我都建议您实现分页(为了您的方便,这个问题的 answer 可能是一个很好的实现引用/指南)以减少内存和网络使用。

现在,比较方法:

  • 方法一

    ...but it must load entire contents of your file into memory.

    这句话可能会让一些人认为这是一个 内存效率低下的解决方案,当它真正意味着你 无法检索部分数据,您只能下载整个 文件。在存储图像的情况下,您可能希望它用于 使数据有意义。

    如果您的应用程序需要每次用户下载图像 访问它(即如果您的图像定期更新),那么这个 方法可能最适合你。图像将被下载 每次应用程序启动时,它们都会在以下时间被丢弃 你杀了它。

    您表示您的部分用户群的互联网可能较弱 连接等下一个方法可能更有效和 用户友好

  • 方法二

    首先,回答您的问题:

    1. 是的。使用此方法下载的图像将存储在用户的设备上。
    2. 图片占用的大小应与其在 Firebase 存储中占用的大小大致相同。

    其次,如果你打算使用这种方法,那么我建议你存储一个 数据库中最后一个时间的时间戳(或任何类型的标记) 图像发生变化。然后,每次打开应用程序时,执行 以下流程:

    1. 如果没有下载图片 -> 下载图片并在本地存储数据库时间戳
    2. 如果本地时间戳不等于数据库上的时间戳 -> 下载图像并将新时间戳存储在本地
    3. Else -> 使用您已有的图像,它们应该与 Firebase 存储中的图像相同

    如果您的网络使用优先级是 高于本地存储。

    最后……

  • 方法三(不是真的)

    不是数据下载方法,它只是生成一个 下载 URL 给 child 一个引用。然后你可以使用那个 在您的应用程序或其他地方下载数据的 URL 只要使用过 应用或 API 已获得访问您的 Firebase 存储空间的授权。

    更新:

    URL 是从 Firebase 引用生成的 (FIRDatabase.database().reference().child("exampleReference")),看起来像这样:(注意:这是一个假链接这实际上不起作用,仅用于说明目的)

    https://firebasestorage.googleapis.com/v0/b/projectName.appspot.com/o/somePathHere%2FchildName%2FsomeOtherChildName%2FimageName.jpg?alt=media&token=1a8f83a7-95xf-4d3s-nf9b-99a274927bcb
    

    如果您只是尝试访问您通过任何常规网络浏览器生成的链接(假设您没有任何与项目中的冲突的 Firebase 规则),您可以直接下载图片来自任何地方,而不仅仅是通过您的应用。

    总而言之,此“方法”不会从 Firebase 存储中下载数据,如果您需要直接链接,它只会返回数据的下载 URL。

关于ios - 三种firebase存储下载方式的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41653009/

相关文章:

javascript - Firebase 如何退订

ios - device.newDefaultLibrary() 返回 nil

ios - 核心蓝牙 : testing state preservation and restoration

ios - 如何从 UIActivityViewController 中排除 Action 事件?

ios - 添加新记录的核心数据错误

swift - 界面 : do { } in Swift

android - 检测已安装的 Play 服务和应用中使用的 Play 服务

Swift & Firebase 无法将类型 'AuthDataResult?' 的值分配给类型“用户?

ios - 为什么 Safari Mobile 无法处理 iOS 8 上的许多输入字段

ios - SFSpeechRecognizer kAFAssistantErrorDomain Code=203 "Retry"