CoreData删除Entry后,如何处理包含CoreData Entry的NSMutableArray,显示为“<fault>”
how to deal with NSMutableArray containing CoreData Entry after Entry is deleted from CoreData, showing as "<fault>"
PersonsArray: NSMutableArray =
(
"<null>",
"<null>",
"<null>",
"<MyProject.Person: 0x7ffc5257d850> (entity: Person; id: 0xd000000000040000 <x-coredata://8DD0B78C-C624-4808-9231-1CB419EF8B50/Person/p1> ; data: {\n image = nil;\n name = dustin;\n})",
"<null>",
"<null>",
"<null>",
"<null>",
"<null>")
如果用户删除CoreData条目(实体:Person;name=dustin)
PersonsArray: NSMutableArray =
(
"<null>",
"<null>",
"<null>",
"<MyProject.Person: 0x7ffc5257d850> (entity: Person; id: 0xd000000000040000 <x-coredata://8DD0B78C-C624-4808-9231-1CB419EF8B50/Person/p1> ; data: <fault>)",
"<null>",
"<null>",
"<null>",
"<null>",
"<null>")
如何检查 PersonsArray
的索引槽是否包含此 "<fault>"
以便我可以 return 将其 "<null>"
?
我删除 tableView 中条目的代码(第二个 VC)
func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
switch editingStyle {
case .Delete:
appDel = UIApplication.sharedApplication().delegate as! AppDelegate
context = appDel.managedObjectContext!
//Could I do something like give VC2 the PersonsArray and here...
//ADD Something like
for ObjectIndex in 0..<PersonsArray.count {
if PersonsArray[ObjectIndex] === results[indexPath.row] {
PersonsArray[ObjectIndex] = NSNull()
}
}
// then continue with the delete?
context.deleteObject(results[indexPath.row] as! NSManagedObject)
context.save(nil)
self.viewDidLoad()
default:
return
}
}
确实没有简单的方法。正确答案是……不要将 NSManagedObject
个实例存储在数组中。在这种情况下使用 NSFetchedResultsController 等,或者重新获取对象以确定剩下的内容。
另一种选择是通过侦听 NSManagedObjectContextDidSave
通知并在对象从上下文中删除时从数组中删除对象来手动维护数组。
使用 NSFetchedResultsController
通常更容易。
更新 1
在您的主视图控制器中,您可以保存对 -objectID
的引用而不是对象。然后,当您尝试实现该对象时,如果它消失了,您将取回 nil
。不漂亮,但可以工作。
然而,您的主视图控制器应该侦听 NSManagedObjectContextDidSaveNotification
并且在该通知中是一个 -userInfo
并且在 属性 内部是三个 NSSet
实例。一个包含所有已更新的对象,一个包含所有已插入的对象和所有已删除的对象。然后,您可以测试以查看删除的任何内容是否在您的数组中,并将它们从您的数组中删除。
PersonsArray: NSMutableArray =
(
"<null>",
"<null>",
"<null>",
"<MyProject.Person: 0x7ffc5257d850> (entity: Person; id: 0xd000000000040000 <x-coredata://8DD0B78C-C624-4808-9231-1CB419EF8B50/Person/p1> ; data: {\n image = nil;\n name = dustin;\n})",
"<null>",
"<null>",
"<null>",
"<null>",
"<null>")
如果用户删除CoreData条目(实体:Person;name=dustin)
PersonsArray: NSMutableArray =
(
"<null>",
"<null>",
"<null>",
"<MyProject.Person: 0x7ffc5257d850> (entity: Person; id: 0xd000000000040000 <x-coredata://8DD0B78C-C624-4808-9231-1CB419EF8B50/Person/p1> ; data: <fault>)",
"<null>",
"<null>",
"<null>",
"<null>",
"<null>")
如何检查 PersonsArray
的索引槽是否包含此 "<fault>"
以便我可以 return 将其 "<null>"
?
我删除 tableView 中条目的代码(第二个 VC)
func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
switch editingStyle {
case .Delete:
appDel = UIApplication.sharedApplication().delegate as! AppDelegate
context = appDel.managedObjectContext!
//Could I do something like give VC2 the PersonsArray and here...
//ADD Something like
for ObjectIndex in 0..<PersonsArray.count {
if PersonsArray[ObjectIndex] === results[indexPath.row] {
PersonsArray[ObjectIndex] = NSNull()
}
}
// then continue with the delete?
context.deleteObject(results[indexPath.row] as! NSManagedObject)
context.save(nil)
self.viewDidLoad()
default:
return
}
}
确实没有简单的方法。正确答案是……不要将 NSManagedObject
个实例存储在数组中。在这种情况下使用 NSFetchedResultsController 等,或者重新获取对象以确定剩下的内容。
另一种选择是通过侦听 NSManagedObjectContextDidSave
通知并在对象从上下文中删除时从数组中删除对象来手动维护数组。
使用 NSFetchedResultsController
通常更容易。
更新 1
在您的主视图控制器中,您可以保存对 -objectID
的引用而不是对象。然后,当您尝试实现该对象时,如果它消失了,您将取回 nil
。不漂亮,但可以工作。
然而,您的主视图控制器应该侦听 NSManagedObjectContextDidSaveNotification
并且在该通知中是一个 -userInfo
并且在 属性 内部是三个 NSSet
实例。一个包含所有已更新的对象,一个包含所有已插入的对象和所有已删除的对象。然后,您可以测试以查看删除的任何内容是否在您的数组中,并将它们从您的数组中删除。