SwiftUI使用EnvironmentObject订阅属性更改
这是我的模型:SwiftUI使用EnvironmentObject订阅属性更改,swift,swiftui,environmentobject,Swift,Swiftui,Environmentobject,这是我的模型: class Channel: Identifiable, Decodable, ObservableObject { var id = UUID() var channelId = "" var title = "" var thumbnail = "" @Published var thumbnailImage : UIImage? enum Codi
class Channel: Identifiable, Decodable, ObservableObject {
var id = UUID()
var channelId = ""
var title = ""
var thumbnail = ""
@Published var thumbnailImage : UIImage?
enum CodingKeys: String, CodingKey {
//Keys not in the model
case snippet
case thumbnails
case high
//Keys in the model
case channelId
case title
case thumbnail = "url"
}
required init (from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
let snippetContainer = try container.nestedContainer(keyedBy: CodingKeys.self, forKey: .snippet)
let thumbnailsContainer = try snippetContainer.nestedContainer(keyedBy: CodingKeys.self, forKey: .thumbnails)
let highContainer = try thumbnailsContainer.nestedContainer(keyedBy: CodingKeys.self, forKey: .high)
self.title = try snippetContainer.decode(String.self, forKey: .title)
self.thumbnail = try highContainer.decode(String.self, forKey: .thumbnail)
self.channelId = try snippetContainer.decode(String.self, forKey: .channelId)
}
}
我有一个链接到ChannelStore的EnvironmentObject,它一切正常
问题是当属性thumbnailImage更改时,需要更新我的视图。(因为它来自网络调用,所以视图在调用返回之前生成,同时使用股票图像)。我尝试将已发布的属性包装器添加到该属性,但没有任何效果
在我看来,我有:@EnvironmentObject var channelStore:channelStore
如何订阅由EnvironmentObject管理的属性更改
编辑
建议将Channel类更改为struct。我创建类的唯一原因是为了避免“cannotassign to property:'channel'是一个'let'常量:
for channel in channelStore.allChannels {
networking.setThumbnail(channel: channel) { image in
channel.thumbnailImage = image
}
}
最终评论
我使用下面提供的答案解决了整个问题,并将for循环更改为以下内容:
for (index, var channel) in channelStore.allChannels.enumerated() {
networking.setThumbnail(channel: channel) { image in
channel.thumbnailImage = image
channelStore.allChannels[index] = channel
print("Images LOADED")
}
}
如果您可以将
频道
设置为结构:
请显示您的查看代码,特别是在使用
频道.thumbnailImage
的地方?
for (index, var channel) in channelStore.allChannels.enumerated() {
networking.setThumbnail(channel: channel) { image in
channel.thumbnailImage = image
channelStore.allChannels[index] = channel
print("Images LOADED")
}
}
struct Channel: Identifiable, Decodable { // <- replace `class` with `struct`
...
var thumbnailImage : UIImage? // <- remove `@Published`
}
class ChannelStore: ObservableObject {
@Published var allChannels = [Channel]()
}