При использовании @Query SwiftData моделей Swift В определенных ситуациях механизм реактивности Swiftui не работает так, как ожидалось, когда изменения массива Massagedata .
Код: Выделить всё
@Model
final class MessageData: Equatable {
@Attribute(.unique) public var name: String
public var etag: String?
public static func == (lhs: MessageData, rhs: MessageData) -> Bool {
// If both have etag, compare etags
if let lhsEtag = lhs.etag, let rhsEtag = rhs.etag {
return lhsEtag == rhsEtag
}
return false
}
}
struct MessageForDisplay {
public text: String
}
< /code>
Swiftui View Code < /h2>
struct ChannelChatView: View {
@Query private var messages: [MessageData]
@State private var displayMessages: [MessageForDisplay]
var body: some View {
MessagesView(messages: displayMessages)
.onChange(of: messages, initial: true) { _, _ in
prepareDisplayMessages(messages: messages)
}
}
func prepareDisplayMessages(messages: [MessageData]) {
// transform [MessageData] to [MessageForDisplay]
displayMessages = messages.map { message in
MessageForDisplay(text: message.text)
}
}
}
< /code>
сравнение сценариев триггера < /h2>
сценарий < /th>
< /th>
dosomething () < /code>? < /th>
Объяснение < /th>
< /tr>
< /thead>
[b] Элементы Array Добавлены < /strong> < /td>
Array..onChange(of: messages)SwiftData обнаруживает изменения массива
array elements сняты [/b]
Код: Выделить всё
.onChange(of: messages)swiftdata обнаруживает изменения массива
Индивидуальное сообщение.
Код: Выделить всё
.onChange(of: messages)SwiftData не обнаруживает изменения внутренних свойств
.
Код: Выделить всё
.task(id: messages)та же проблема - не обнаруживает изменений внутренних свойств
mapping Etag Array (OnChange) [/b]
mapping Etag
Код: Выделить всё
.onChange(of: messages.map { $0.etag })явно отслеживает изменения ETAG
картирование eTag Array (задача)
.
Код: Выделить всё
.task(id: messages.map { $0.etag })Явно отслеживает изменения ETAG
phorge (of/operse operse- of> of of/operse)
phorge/pression swiftdata /swiftui < /li>
< /ul>
Любое объяснение ценится! < /p>
Подробнее здесь: https://stackoverflow.com/questions/797 ... s-property
Мобильная версия