how to deal with NSMutableArray containing CoreData Entry after Entry is deleted from CoreData, showing as “<fault>”

落爺英雄遲暮 提交于 2019-12-11 02:17:42

问题


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>")

if the user deletes CoreData Entry (entity: 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>")

How can I check if a index slot of PersonsArray contains this "<fault>" so that I can return it to "<null>"?


My code that deletes entry in tableView (second 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
    }
}

回答1:


There really is no easy way. The right answer is ... don't store NSManagedObject instances in an array. Use NSFetchedResultsController, etc. when you are in that situation or refetch the objects to determine what is left.

Another option is to manually maintain the array by listening for NSManagedObjectContextDidSave notifications and removing objects from the array when they are deleted from the context.

Using a NSFetchedResultsController is generally easier.

Update 1

In your main view controller you can hold a reference to the -objectID instead of the object. Then when you attempt to realize the object you will get back a nil if it is gone. Not pretty but that can work.

Instead, however, your main view controller should listen for NSManagedObjectContextDidSaveNotification and in that notification is a -userInfo and inside of that property are three NSSet instances. One containing all objects that were updated, one for all that were inserted and for all that were deleted. You can then test to see if anything that was deleted was in your array and remove them from your array.



来源:https://stackoverflow.com/questions/29956065/how-to-deal-with-nsmutablearray-containing-coredata-entry-after-entry-is-deleted

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!