2017-05-04 5 views
0

Lassen Sie uns sagen, dass dies unsere Funktion aus dem Modell zum Löschen Objekte ist:Die do-Anweisung

func delete(indexPath: IndexPath) { 

    let managedObject = self.fetchedResultsController.object(at: indexPath) 
    self.managedObjectContext.delete(managedObject) 

    do { 

     // Save changes 
     try self.managedObjectContext.save() 

     // Cancel the notification 
     let center = UNUserNotificationCenter.current() 
     center.removeDeliveredNotifications(withIdentifiers: [managedObject.uuid!]) 
     center.removePendingNotificationRequests(withIdentifiers: [managedObject.uuid!]) 

     // Reload tableView 
     self.tableView.reloadData() 

    } catch { 

     let alertController = UIAlertController.init(title: "Error", message: "We are sorry! Unknown error occured...", preferredStyle: .alert) 
     alertController.addAction(UIAlertAction.init(title: "Close", style: .default, handler: { (action) in 
      // Completion handler 
     })) 
     self.present(alertController, animated: true, completion: { 
      // Completion block 
     }) 
    } 
} 

Frage:

Wenn ein Fehler ausgelöst, geht die Ausführung zu den catch Klauseln. Das ist schön. Aber was passiert mit den Anweisungen (Rest des Codes, Abbrechen der Benachrichtigung und Reload tableView)? Diese Anweisungen sind noch ausführbar oder einfach ignoriert?

+1

sobald der Fehler in dieser ausgelöst wird, Zeile 'try self.managedObjectContext.save()', der Rest des Codes wird nicht ausgeführt und in die catch-Anweisung übernommen. Möchten Sie die Anweisungen trotzdem ausführen, selbst wenn ein Fehler auftritt? –

+0

@ShamasS Nein! Ich brauche keine Anweisungen, wenn ein Fehler ausgelöst wird. Vielen Dank für Ihren Kommentar. – Mannopson

+1

Diese Zeilen werden ignoriert, da in der vorherigen Zeile ein Fehler aufgetreten ist. Wenn es das ist, was du willst und das passiert, könntest du deine Frage anders formulieren? –

Antwort

1

Wenn Sie möchten, dass Ihr Code auch dann noch aufgerufen wird, wenn ein Fehler ausgelöst wird, können Sie entweder eine separate Funktion dafür erstellen und sie am Ende der Anweisungen do und catch aufrufen. Oder Sie können diesen Code in eine defer Anweisung setzen.

Entweder etwas wie

func delete(indexPath: IndexPath) { 

let managedObject = self.fetchedResultsController.object(at: indexPath) 
self.managedObjectContext.delete(managedObject) 

do { 

    // Save changes 
    try self.managedObjectContext.save() 
    reloadCode() 

} catch { 
    reloadCode() 
    let alertController = UIAlertController.init(title: "Error", message: "We are sorry! Unknown error occured...", preferredStyle: .alert) 
    alertController.addAction(UIAlertAction.init(title: "Close", style: .default, handler: { (action) in 
     // Completion handler 
    })) 
    self.present(alertController, animated: true, completion: { 
     // Completion block 
    }) 
} 
} 

func reloadCode() { 
     // Cancel the notification 
     let center = UNUserNotificationCenter.current() 
     center.removeDeliveredNotifications(withIdentifiers: [managedObject.uuid!]) 
     center.removePendingNotificationRequests(withIdentifiers: [managedObject.uuid!]) 

     // Reload tableView 
     self.tableView.reloadData() 

} 

Oder mehr ordentlich,

func löschen (indexPath: IndexPath) {

let managedObject = self.fetchedResultsController.object(at: indexPath) 
self.managedObjectContext.delete(managedObject) 


    defer { 
let center = UNUserNotificationCenter.current() 
     center.removeDeliveredNotifications(withIdentifiers: [managedObject.uuid!]) 
     center.removePendingNotificationRequests(withIdentifiers: [managedObject.uuid!]) 

     // Reload tableView 
     self.tableView.reloadData() 
} 
do { 

    // Save changes 
    try self.managedObjectContext.save() 

    // Cancel the notification 


} catch { 

    let alertController = UIAlertController.init(title: "Error", message: "We are sorry! Unknown error occured...", preferredStyle: .alert) 
    alertController.addAction(UIAlertAction.init(title: "Close", style: .default, handler: { (action) in 
     // Completion handler 
    })) 
    self.present(alertController, animated: true, completion: { 
     // Completion block 
    }) 
} 

}

Verwandte Themen