SwiftUI: избегайте воссоздания подробного вида при изменении данных в мастере - PullRequest
4 голосов
/ 03 февраля 2020

Я нахожусь в обычном сценарии приложения чата, где список разговоров определяется источником данных.

struct ConversationsView: View {
    @ObservedObject var dataSource: ConversationsDataSource

    ...

    var body: some View {
        NavigationView {
            List {
                ForEach(dataSource.items) { item in
                    NavigationLink(destination: ChatView(conversationId: item.identifier)) {
                        Text(item.identifier)
                    }
                }
            }
        }
    }
}

Я могу нажать на ячейку и ввести ChatView, примерно например:

struct ChatView: View {
    @ObservedObject var dataSource: ChatDataSource

    ...

    var body: some View {
        List {
            ForEach(dataSource.messages) { message in
                MessageView(message: message)
            }
        }
    }
}

Когда я нахожусь внутри ChatView и отправляю сообщение, ConversationsDataSource обновляется. Следовательно, ConversationsView s body перезагружается, а ChatView воссоздается, что я не считаю хорошим для производительности. Также я не получаю никакой анимации при вставке сообщения из-за этого.

Можно ли избежать воссоздания целевого представления NavigationLink при изменении ConversationsDataSource?

Не перезагружать ConversationsView body когда вид не виден, не является решением, потому что в раздельном представлении на iPad список разговоров и текущий чат открыты вместе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...