SwiftUI如何通过ID而不是索引从ForEach中删除

时间:2020-04-09 22:41:23

标签: swiftui

以下代码使我不舒服。

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将立即更新,并且索引仍然是准确的,但是我更希望获得一组要删除的 identifiers 而不是一组索引。有没有办法做到这一点?注意:Identifiable要求这些“历史会话”符合ForEach,因此它们都具有ID。就我而言,它们是UUIDs

1 个答案:

答案 0 :(得分:0)

也许这有助于在删除所选索引时锁定历史记录会话:

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
     }
}
}