Ios 在SwiftUI中切换视图后,Firebase图像为空
我正在尝试显示Firebase中存储的对象列表中的图像。最初图像加载良好,但如果切换到其他视图并返回列表视图,图像将不会再次加载 在两次加载尝试中,图像数据似乎都按预期保存: 下面是我的图像加载器代码,它使用url从Firebase存储获取图像,以及包含图像的列表行 斯威夫特 斯威夫特Ios 在SwiftUI中切换视图后,Firebase图像为空,ios,swift,firebase,firebase-storage,swiftui,Ios,Swift,Firebase,Firebase Storage,Swiftui,我正在尝试显示Firebase中存储的对象列表中的图像。最初图像加载良好,但如果切换到其他视图并返回列表视图,图像将不会再次加载 在两次加载尝试中,图像数据似乎都按预期保存: 下面是我的图像加载器代码,它使用url从Firebase存储获取图像,以及包含图像的列表行 斯威夫特 斯威夫特 我解决这个问题的方法是创建一个自定义的ImageView并在这个视图中处理图像加载。我通过跟踪发现了这一点,并意识到我错过了这一步。如果有人能解释为什么使用内置的SwiftUI图像会导致这个问题,我会非常感激
我解决这个问题的方法是创建一个自定义的ImageView并在这个视图中处理图像加载。我通过跟踪发现了这一点,并意识到我错过了这一步。如果有人能解释为什么使用内置的SwiftUI图像会导致这个问题,我会非常感激 斯威夫特 FBURLImage.swift 斯威夫特
我解决这个问题的方法是创建一个自定义的ImageView并在这个视图中处理图像加载。我通过跟踪发现了这一点,并意识到我错过了这一步。如果有人能解释为什么使用内置的SwiftUI图像会导致这个问题,我会非常感激 斯威夫特 FBURLImage.swift 斯威夫特
关于这些函数的使用环境,目前还不太清楚。一般来说,当封闭视图在viewController中打开时,您会希望填充tableView数据源,然后tableView会在需要刷新或滚动时从填充的数组中提取数据。您正在尝试从行本身中加载每一行吗?如果是这样的话,那将是非常滞后的,并且由于Firebase的异步特性而无法正常工作。如果没有,您可能希望包含更多的代码,以便我们能够理解用例。我创建了一个列表,一个SwiftUI视图,它在我的对象列表中循环,并在每个列表行中填充一个视图,该视图当前只是一个imageUrl。是的,每个列表行的图像都加载到视图本身中。我应该在将UIImage传递到子视图之前加载它吗?它看起来像self.imageLoader.imageFromData在某个点上为nil,因此图像是用UIImage初始化的,这会导致一个空白图像。这些函数使用的上下文有点不清楚。一般来说,当封闭视图在viewController中打开时,您会希望填充tableView数据源,然后tableView会在需要刷新或滚动时从填充的数组中提取数据。您正在尝试从行本身中加载每一行吗?如果是这样的话,那将是非常滞后的,并且由于Firebase的异步特性而无法正常工作。如果没有,您可能希望包含更多的代码,以便我们能够理解用例。我创建了一个列表,一个SwiftUI视图,它在我的对象列表中循环,并在每个列表行中填充一个视图,该视图当前只是一个imageUrl。是的,每个列表行的图像都加载到视图本身中。我应该在将UIImage传递到子视图之前加载它吗?它看起来像self.imageLoader.imageFromData在某个点上为零,因此映像将用UIImage初始化,从而生成一个空白映像。下面是代码imageLoader.data!=无UIImagedata:imageLoader.data!!:UIImage-当imageLoader.data为nil时会发生什么?下面是这段代码imageLoader.data的一个想法!=无UIImagedata:imageLoader.data!!:UIImage-imageLoader.data为零时会发生什么情况?
import Foundation
import SwiftUI
import Firebase
import FirebaseFirestore
class ImageLoader: ObservableObject {
@Published var dataIsValid = false
var data:Data?
func loadImage(url: String) {
let imageRef = Storage.storage().reference(forURL: url)
imageRef.getData(maxSize: 1 * 1024 * 1024) { data, error in
if let error = error {
print("\(error)")
}
guard let data = data else { return }
DispatchQueue.main.async {
print(self.dataIsValid)
self.dataIsValid = true
self.data = data
}
}
}
func imageFromData() -> UIImage {
UIImage(data: self.data!)!
}
}
import SwiftUI
import Combine
struct EventRow: View {
@ObservedObject var imageLoader = ImageLoader()
var imageUrl: String
var body: some View {
HStack {
Image(uiImage: self.imageLoader.dataIsValid ? self.imageLoader.imageFromData() : UIImage())
.resizable()
.frame(width: 100.0, height: 140.0)
.background(Color.gray)
.clipShape(RoundedRectangle(cornerRadius: 5.0))
}
.onAppear {
self.imageLoader.loadImage(url: self.imageUrl)
}
}
}
import SwiftUI
struct ListRow: View {
var imageUrl: String
var body: some View {
HStack {
FBURLImage(url: imageUrl)
}
}
}
import SwiftUI
struct FBURLImage: View {
@ObservedObject var imageLoader: ImageLoader
init(url: String) {
imageLoader = ImageLoader()
imageLoader.loadImage(url: url)
}
var body: some View {
Image(uiImage:
imageLoader.data != nil ? UIImage(data: imageLoader.data!)! : UIImage())
.resizable()
.frame(width: 100.0, height: 140.0)
.background(Color.gray)
.clipShape(RoundedRectangle(cornerRadius: 5.0))
}
}
import Foundation
import SwiftUI
import Firebase
import FirebaseFirestore
class ImageLoader: ObservableObject {
@Published var data: Data?
func loadImage(url: String) {
let imageRef = Storage.storage().reference(forURL: url)
imageRef.getData(maxSize: 1 * 1024 * 1024) { data, error in
if let error = error {
print("\(error)")
}
guard let data = data else { return }
DispatchQueue.main.async {
self.data = data
}
}
}
}