首页 > 解决方案 > @Published 有多“昂贵”(SwiftUI)

问题描述

我分别使用协议ObservableObject@Published属性包装器来用获取的数据(在本例中为图像)异步更新我的视图结构。这工作正常,但我想知道是否可能有一种不那么“昂贵”的方式。我正在获取的图像(个人资料图片)基本上是静态的,除了异步获取过程。我不确定(对于内存或运行时)有多昂贵@Published,但我觉得可能有更有效的解决方案。在那儿?

代码:

class ImageFetcher: ObservableObject {
    var firebaseManager: FirebaseManager
    @Published var image: UIImage? = nil

    init(_ firebaseManager: FirebaseManager) {
        self.firebaseManager = firebaseManager
    }

    func fetchImage(id: String) {
        let ref = getRefURL(uid: id)
        print(ref)
        ref.getData(maxSize: 2051240) { data, error in
            if let error = error {
                print("Error: \(error)")
                return
            }
            self.image = UIImage(data: data!)
        
        }
    }

    func getRefURL(uid: String) -> StorageReference {
        return firebaseManager.STORAGE.reference().child(uid)
    }
}


struct ImageView: View {
    @ObservedObject var fetcher: ImageFetcher

    init(_ firebaseManager: FirebaseManager) {
        self.fetcher = ImageFetcher(firebaseManager)
    }


    var body: some View {

        Button {
            fetcher.fetchImage(id: "QDhKhNe5VnWDCORoQScIVVzcpzv2")
        } label: {
            Text("Load Image")
        }

        if fetcher.image == nil {
            Text("Loading...")
        } else {
            Image(uiImage: fetcher.image!)
                .resizable()
                .frame(width: 50, height: 50)
        }
    }
}

注意:代码包括在我的代码中其他地方定义的对象以及对我的存储的引用(您将无法访问),因此代码旨在读取,但不一定运行,因为它不起作用。

标签: swiftfirebaseobservable

解决方案


所以@Published 的表现还不错。SwiftUI 旨在能够处理视图的多次重新加载(当将值设置为 @Published 时会发生这种情况)。因此,如果您想保留此架构,我建议您删除 @Published ,然后使用它objectWillChange.send()来控制您的视图何时更新。@Published 是为组合而设计的,您似乎并没有使用它。

我个人根本不使用类/ ObservableObject。


推荐阅读