2017-05-04 47 views
0

比方说,这是我们从模型中删除对象功能:do语句

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

只要误差在此抛出行尝试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 
    }) 
} 

}