swift - 下载 SwiftUI ListView 中 Firebase 存储的图像(联系应用)

标签 swift firebase google-cloud-firestore swiftui google-cloud-storage

我是 Swift 新手,我正在尝试在 SwiftUI ListView 中显示:

  • 一些数据
  • 图像(链接到数据)

这是一种联系人应用程序。

所有这些数据都存储在firestore中。我创建了一个函数,它给出了 firestore 上的图像 URL:

func getURL(path: String, completion: @escaping (((URL?) -> Void))) {
    let storage = Storage.storage()
    storage.reference().child(path).downloadURL(completion: { url, error in
        guard let url = url, error == nil else {
            return
        }
        let urlPath = url.absoluteURL
        completion(urlPath)
    })
}

但是当我在 SwiftUI View 中调用此函数时,出现以下错误:

"Type '()' cannot conform to 'View'; only struct/enum/class types can conform to protocols"

有函数的调用代码:

getURL(路径:bike.access1,完成:{ AnimatedImage 中的路径(url:路径)})

我知道我无法在 View 内调用函数,但我不知道如何设法在 SwiftUI ListView 内显示来自 Firestore 的图像。 如果有人知道策略,我真的很感兴趣。 提前致谢 吉恩

最佳答案

完成处理程序(通常)是处理异步代码的好方法。但是,它是 SwiftUI 中的 View,更常见的是使用 @State 或 @Published 值,然后根据其状态有条件地渲染 View 。

我喜欢使用 ObservableObject View 模型来处理此类事情:

class ViewModel : ObservableObject {
    @Published var imageURL : URL?
    
    func getURL(path: String) {
        let storage = Storage.storage()
        storage.reference().child(path).downloadURL(completion: { url, error in
            guard let url = url, error == nil else {
                return
            }
            self.imageURL = url
        })
    }
}

struct ContentView : View {
    @StateObject private var viewModel = ViewModel()
    
    var body: some View {
        VStack {
            if let url = viewModel.imageURL {
                AnimatedImage(url: url)
            }
        }.onAppear {
            viewModel.getURL(path: "URL_STRING_GOES_HERE")
        }
    }
}

请注意我的类型

关于swift - 下载 SwiftUI ListView 中 Firebase 存储的图像(联系应用),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67132691/

相关文章:

swift - 为什么这个排序算法会失败?

ios - 在 iOS 中使用 Firebase 的云函数

node.js - 如何在单个请求中读取 Firestore 中的多个文档?

ios - 在主机应用程序和今日扩展程序之间共享用户生成的图像的最佳方式是什么

ios - 使用 UIImage 和其他属性创建自定义图像

swift - 为什么访问控制有用?

javascript - 为什么这个 Firebase 可调用函数不返回值?

swift - 无法使用新的 Firebase 将类型 '__NSDictionaryM' 的值转换为自定义用户类

firebase - Flutter Firestore - 查找 `Document Snapshot` id

java - Android - 事务 - 任务尚未完成