SwiftUI как удалить из ForEach по ID, а не по индексу - PullRequest
1 голос
/ 10 апреля 2020

Следующий код причиняет мне неудобство.

struct HistoryView: View {

    @ObservedObject var history: History

    var body: some View {
        List {
            ForEach(history.getSessions()) { sess in
                Text("Duration: \(sess.duration)")
            }.onDelete(perform: self.onDelete)
        }
    }

    private func onDelete(_ indexSet: IndexSet) {
        ...
    }
}

Проблема в том, что History - это очень асинхронная вещь. Это модель, подключенная к CloudKit. Это может быть получение обновлений в фоновом режиме. В идеале, если он обновится, этот View будет обновлен немедленно, и индексы все равно будут точными, но я бы предпочел получить набор идентификаторов для удаления, а не набор индексов. Есть ли способ сделать это? Примечание: эти «сеансы истории» соответствуют Identifiable, как того требует ForEach, поэтому все они имеют идентификаторы. В моем случае они UUIDs.

1 Ответ

0 голосов
/ 10 апреля 2020

возможно, это может помочь заблокировать сеансы истории, пока вы удаляете выбранный вами индекс:

struct HistoryView: View {

@ObservedObject var history: History
private let syncQueue = DispatchQueue(label: "com.xxx.yyy.zzz")

var body: some View {
    List {
        ForEach(history.getSessions()) { sess in
            Text("Duration: \(sess.duration)")
        }.onDelete(perform: self.onDelete)
    }
}

private func onDelete(_ indexSet: IndexSet) {
    syncQueue.sync {
        // do the delete
     }
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...