iosswiftxcodeswiftuirealm

RealmSwift: Problem with deleting objects after alert


In my app using RealmSwift there's the following list:

List {
   ForEach(datasets) { dataset in
      Text("\(dataset.name)")
   }
   .onDelete(perform: deleteDataset)
}

The called function is:

func deleteDataset(at indexes: IndexSet) {
    for index in indexes {
        RealmService.shared.deleteDataset(datasets[index])
    }
}

And in RealmService I use the following code:

func deleteDataset(_ dataset: Dataset) {
    do {
        if let forDeletion = realm.object(ofType: Dataset.self, forPrimaryKey: dataset.id) {
            try realm.write {
                realm.delete(forDeletion)
            }
        } else {
            print("DATASET not found or already deleted")
        }
    } catch {
        print("Error deleting DATASET: \(error.localizedDescription)")
    }
}

It works like expected and the dataset can be deleted.

But now I want to add an alert to confirm before delete. I've changed my code to this:

List {
   ForEach(datasets) { dataset in
      Text("\(dataset.name)")
   }
   .onDelete(perform: showMyHint)
}
.alert(isPresented: self.$showHint) {
        Alert(title: Text("Achtung"), message: Text("Soll dieser Datensatz tatsächlich gelöscht werden?"), primaryButton: .destructive(Text("Delete")) {
            self.deleteDataset(at: self.forDeletion)
                    }, secondaryButton: .cancel() {
                        self.forDeletion = []
                    }
                )
            }

func showMyHint(at indexes: IndexSet) {
   for index in indexes {
      self.forDeletion = indexSet
      self.showHint = true
   }
}

But now I get the following error:

*** Terminating app due to uncaught exception 'RLMException', reason: 'Index 1 is out of bounds (must be less than 1).'

After a restarting the app, the dataset is deleted.

I don't know, what's the problem. Can you help me? Thanks in advance!


Solution

  • I've found the following solution: Adding a Realm in an ObservableObject

    class RealmService: ObservableObject {
    
       @Published var localRealm: Realm
    
    
       init() {
        
          do {
            
             localRealm = try! Realm()
    
          } catch let error {
             fatalError("Realm can't be initialized: \(error.localizedDescription)")
          }         
       } 
    
    }
    

    Then I inserted it as EnvironmentObject to all subsequent views:

    @EnvironmentObject var realmService: RealmService
    

    Now it's possible to delete after showing the alert for confirmation.