У меня есть приложение с двумя вкладками, где на первой вкладке отображается список сгруппированных медиафайлов, а на второй вкладке вы можете отобразить более подробную информацию о медиасетке и изменить некоторые ее свойства. Для медиа-группы есть изображение выделения/миниатюры, которое пользователь может выбрать в другом месте приложения (например, на второй вкладке). Я пытаюсь отразить изменения в пользовательском интерфейсе, где пользователь меняет его, и это кажется очень ошибочным. Ищем лучший подход. Заранее спасибо.
struct MediaItemView: View {
@State private var loadedThumbnail: Image?
@ObservedObject var model: MediaGroup
var body: View {
ZStack {
// show image and other information
}.task {
if let thumbMedia = model.thumbnail {
imageLoader.load(thumbMedia) { thumbnail in
self.loadedThumbnail = thumbnail
}
}
}
}
}
// Model
class MediaGroup: ObservableObject {
@Published var thumbnaill: UUID // id of the media
}
Когда пользователь меняет миниатюру модели, я устанавливаю ее и отправляю сообщение model.objectWillChange.send(). Но поскольку переменная состояния вычисляется при входе через задачу { ... }, она не фиксирует никаких будущих изменений.
В настоящее время я использую уведомление NotificationCenter, чтобы принудительно перезагрузить его на уровне представления, но я ищу лучший способ исправить изменения с помощью комбинированного фрейма, но не знаю, как это сделать. Может ли кто-нибудь дать некоторые идеи для этого?
Спасибо. Не могу поверить, что я пропустил это. Можете ли вы опубликовать это как ответ, и я закрою вопрос.
.task(id: model.thumbnail)
Вы можете попробовать другой подход к использованию NotificationCenter
и Combine
, используя
.onChange(of: model.thumbnaill) {
}
чтобы listen
внести изменения в ваш model.thumbnaill
и выполнить некоторый код.
Почему бы просто не использовать
.onChange(of: model.thumbnaill) { ... }