swift - @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)
}
}
}
注意:代码包括在我的代码中其他地方定义的对象以及对我的存储的引用(您将无法访问),因此代码旨在读取,但不一定运行,因为它不起作用。
解决方案
所以@Published 的表现还不错。SwiftUI 旨在能够处理视图的多次重新加载(当将值设置为 @Published 时会发生这种情况)。因此,如果您想保留此架构,我建议您删除 @Published ,然后使用它objectWillChange.send()
来控制您的视图何时更新。@Published 是为组合而设计的,您似乎并没有使用它。
我个人根本不使用类/ ObservableObject。
推荐阅读
- python-sphinx - Sphinx 标题中的重音字符
- node.js - 如何判断节点是如何安装的?
- swift - 有什么方法可以将 tradingview 图表导入我的 ios 应用程序?
- javascript - 用 craco 去掉 create-react-app 开发服务器
- statistics - 调整多重比较问题的值
- arrays - 大步广播形状
- python - 将数据输入到 javascript 框架中的 Python 脚本
- ios - Xcode NSException 和 NSUnknownKeyException
- android - 如何在 Fragment 中使用 Recycler View
- spring-boot - Spring Boot 在 AWS EC2 上自动关闭