Почему онконг (OF: @Query Results), когда изменяется свойство модели SwiftData?IOS

Программируем под IOS
Ответить
Anonymous
 Почему онконг (OF: @Query Results), когда изменяется свойство модели SwiftData?

Сообщение Anonymous »

Описание задачи
При использовании @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)

✅ Triggers
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 })

✅ Triggers
явно отслеживает изменения 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»