ここに私のモデルがあります:
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)
}
}
class ChannelStore: ObservableObject {
@Published var allChannels = [Channel]()
}
ChannelStore にリンクされた EnvironmentObject があり、すべて期待どおりに動作します。
問題は、プロパティのサムネイル画像が変更されたときにビューを更新する必要があることです。(ネットワーク呼び出しからのものであるため、呼び出しが返される前にビューが生成され、その間にストック画像が使用されます)。そのプロパティに Published プロパティ ラッパーを追加しようとしましたが、何もしませんでした。
私の見解では:@EnvironmentObject var channelStore: ChannelStore
EnvironmentObject によって管理されるプロパティの変更をサブスクライブする方法は?
編集
Channel クラスを構造体に変更することが提案されました。私がクラスを作成した唯一の理由は、「プロパティに割り当てることはできません: '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")
}
}