我是 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/