2017-05-04 7 views
0

だが、これがモデルから削除するオブジェクトのための私達の機能であるとしましょうか:は、if文

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)で何が起こるのですか?これらのステートメントは実行可能なものか単純なものか無視されますか?

+1

とすぐにエラーがこれにスローされるよう'try self.managedObjectContext.save()'を実行すると、残りのコードは実行されず、catchステートメントに入ります。エラーがスローされても依然として文を実行したいですか? –

+0

@ShamasSいいえ!私はエラーがスローされたときには何も言わない。あなたのコメントをありがとう – Mannopson

+1

前の行にエラーがあったので、それらの行は無視されます。それがあなたが望むものであれば、それは起こっていることです、あなたはあなたの質問を言い換えることができますか? –

答えて

1

エラーがスローされてもコードを呼び出す場合は、別の関数を作成して、docatchの両方のステートメントの最後から呼び出すことができます。または、そのコードを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を削除(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 
    }) 
} 

}