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]()
}