Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/105.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在SwiftUI中切换视图后,Firebase图像为空_Ios_Swift_Firebase_Firebase Storage_Swiftui - Fatal编程技术网

Ios 在SwiftUI中切换视图后,Firebase图像为空

Ios 在SwiftUI中切换视图后,Firebase图像为空,ios,swift,firebase,firebase-storage,swiftui,Ios,Swift,Firebase,Firebase Storage,Swiftui,我正在尝试显示Firebase中存储的对象列表中的图像。最初图像加载良好,但如果切换到其他视图并返回列表视图,图像将不会再次加载 在两次加载尝试中,图像数据似乎都按预期保存: 下面是我的图像加载器代码,它使用url从Firebase存储获取图像,以及包含图像的列表行 斯威夫特 斯威夫特 我解决这个问题的方法是创建一个自定义的ImageView并在这个视图中处理图像加载。我通过跟踪发现了这一点,并意识到我错过了这一步。如果有人能解释为什么使用内置的SwiftUI图像会导致这个问题,我会非常感激

我正在尝试显示Firebase中存储的对象列表中的图像。最初图像加载良好,但如果切换到其他视图并返回列表视图,图像将不会再次加载

在两次加载尝试中,图像数据似乎都按预期保存:

下面是我的图像加载器代码,它使用url从Firebase存储获取图像,以及包含图像的列表行

斯威夫特

斯威夫特


我解决这个问题的方法是创建一个自定义的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
            }
        }
    }
}