我有一个FileSystem类,用于管理托管对象的所有保存和提取。我写了下面的函数从托管上下文中删除项目
func deleteTaxFile(fileToDelete: TaxFile) {
guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {
return
}
let managedContext = appDelegate.persistentContainer.viewContext
let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: EntityNames.taxFiles.rawValue)
if let result = try? managedContext.fetch(fetchRequest) {
for object in result {
if TaxFile(taxFile: object) == fileToDelete {
managedContext.delete(object)
}
}
}
do {
try managedContext.save()
} catch let error as NSError {
print("Could not save. \(error), \(error.userInfo)")
}
}
EntityNames.taxFile.rawValue只是我的托管对象(“ TaxFile”)的枚举名称
我还有一个表视图,其中列出了其中一些文件。
我想在表视图上实现删除功能,该功能从表视图中删除项目。下面是我对表格视图删除功能的实现。
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
fileSystem.deleteTaxFile(fileToDelete: taxFiles[indexPath.item])
setupData()
tableView.deleteRows(at: [indexPath], with: .fade)
}
}
列出的setupData()方法如下所示
func setupData() {
let error = fileSystem.debugger {
try self.taxFiles = self.fileSystem.getOwnersTaxFiles(owner: self.appDelegate.profile!.getUserName())
}
if (error != nil) {
print("Error with Claims screen, setupData method. Error: \(String(describing: error))")
}
calculator = TaxCalculator(profile: appDelegate.profile!)
claimsTableView.delegate = self
claimsTableView.dataSource = self
claimsTableView.reloadData()
totalClaimsLabel.text = "Total claimed: \(String(describing: calculator!.getTotalToBeClaimed()))"
}
fileSystem.getOwnersTaxFiles()看起来像这样
func getOwnersTaxFiles(owner: String) throws -> [TaxFile] {
fetch(.taxFiles)
var result = [TaxFile]()
if (taxFiles.count == 0 ) {
throw FileSystemErrors.taxFileNotFound
} else {
for taxFile in taxFiles {
if (taxFile.getOwner() == owner) {
result.append(taxFile)
}
}
}
return result
}
最后,fetch()方法如下所示
private func fetch(_ entity: EntityNames) {
guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {
return
}
let managedContext = appDelegate.persistentContainer.viewContext
let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: entity.rawValue)
do {
if entity.rawValue == "Profile" {
managedProfiles = try managedContext.fetch(fetchRequest)
convertManagedObjects(to: .userProfile)
} else if entity.rawValue == "TaxFile" {
managedTaxFiles = try managedContext.fetch(fetchRequest)
convertManagedObjects(to: .taxFile)
}
} catch let error as NSError {
print("Could not fetch. \(error), \(error.userInfo)")
}
}
到目前为止,所有获取方法都可以正常工作。但是,当我从托管上下文中删除对象时,该对象将被确定删除(当我使用TaxCaculator类获取它时,文件将被删除),但是当我使用任何其他类获取对象时,删除的对象仍然保留。
重要说明:应用重新启动后,不会未获取文件。因此,当我终止该应用程序并重新启动时,不会提取已删除的文件。
有人能弄清楚这里发生了什么吗?如果您认为您需要更多我的代码,请告诉我。