如何在AsyncImage
中使用从getData
类下载的URL
?
struct RecentItemsView: View {
var item: dataType // var's from getData class
var body: some View {
HStack(spacing: 15) {
AsyncImage(url: URL(string: item.pic), content: { image in // item.pic here
image.resizable()
}, placeholder: {
ProgressView()
})
我有来自downloadURL
的完整URL
,但是当我在AsyncImage
中使用item.pic
参数时,我得到错误:***(参见图片)***
我知道这个错误包含了图像的路径,这不适合AsyncImage
,这就是为什么我下载了完整的URL
,问题是如何在AsyncImage
中使用收到的URL
?
class getData : ObservableObject {
@Published var datas = [dataType]()
init() {
let db = Firestore.firestore()
db.collection("items").getDocuments { (snap, err) in
if err != nil {
print((err?.localizedDescription)!)
return
}
for i in snap!.documents {
let id = i.documentID
let title = i.get("title") as! String
let description = i.get("description") as! String
let pic = i.get("pic") as! String
self.datas.append(dataType(id: id, title: title, description: description, pic: pic))
let storage = Storage.storage()
let storageRef = storage.reference().child("\(pic)")
storageRef.downloadURL { url, error in
if let error = error {
print("Failed to download url:", error)
return
} else {
print(url!) // Full Url- https://firebasestorage.googleapis.com:...
}
}
}
}
}
}
struct dataType : Identifiable {
var id = UUID().uuidString
var title : String
var description : String
var pic : String
}
错误:
储存空间:
火灾恢复:
1条答案
按热度按时间mm9b1k5b1#
这看起来和你当前的方法有很大的不同,但是给予一下,它会从整体上简化你的代码。
主要区别是使用
async await
和FirebaseFirestoreSwift
。我选择使用
async await
/Concurrency是因为它提供了一种更线性的代码方法,并且我认为它解决了与所有对象共享变量的问题。这是
ObservableObject
的外观并且您的
struct
应该更改为使用@DocumentID
。现在可以修改您的视图以使用更新的变量。
class GetData
是一个非常简单的框架,它使用下面的代码来实际进行调用,我喜欢使用泛型来简化代码,这样它就可以被各种地方重用。你不必完全理解这是怎么回事,现在,但你应该,我已经把一吨的意见,所以它应该很容易。
所有这些代码都可以工作,如果你把所有这些代码放在一个
.swift
文件中,它将编译,并应该与你的数据库一起工作。