1

これがモデルからオブジェクトを削除するための関数だとしましょう:

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

質問:

エラーがスローされた場合、実行はcatch句に転送されます。それはすばらしい。しかし、ステートメント (コードの残りの部分、通知をキャンセルし、tableView をリロードする) はどうなりますか? それらのステートメントはまだ実行可能ですか、それとも単純に無視されますか?

4

1 に答える 1

2

エラーがスローされた場合でもコードを呼び出したい場合は、別の関数を作成して、doandcatchステートメントの両方の最後から呼び出すことができます。deferまたは、そのコードをステートメントに入れることもできます。

どちらかのようなもの

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()

}

またはもっときれいに、

func delete(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
    })
  }
}
于 2017-05-04T03:06:35.163 に答える