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 实例。一个包含所有已更新的对象,一个包含所有已插入的对象和所有已删除的对象。然后,您可以测试以查看删除的任何内容是否在您的数组中,并将它们从您的数组中删除。