NSFetchedResultsChangeUpdate而不是NSFetchedResultsChangeDelete

我有一个NSFetchedResultsController以下列方式启动:

NSEntityDescription *myEntity = [NSEntityDescription entityForName:@"MyEntity" inManagedObjectContext:managedObjectContext]; NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; [fetchRequest setEntity:myEntity]; [fetchRequest setFetchBatchSize:10]; [fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"wasDeleted == %@", [NSNumber numberWithBool:NO]]]; NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES selector:@selector(caseInsensitiveCompare:)]; [fetchRequest setSortDescriptors:[NSArray arrayWithObject:sortDescriptor, nil]]; myFetchedResults = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:nil]; myFetchedResults.delegate = self; [myFetchedResults performFetch:nil]; 

一些事实:

  • wasDeleted是MyEntity的一个NSNumber属性(BOOL)

  • 如果我更新此属性[NSNumber numberWithBool:YES] NSFetchedResultsControllerDelegate调用didChangeObject但触发NSFetchedResultsChangeUpdate而不是NSFetchedResultsChangeDelete

  • 然而,如果我popup视图,并再次获取结果控制器,该对象不存在了,显示[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"wasDeleted == %@", [NSNumber numberWithBool:NO]]]; 作品。

  • 在这NSFetchedResultsChangeUpdate后,当cellForRow被调用,我打印wasDeleted,它被设置为YES。

这里有什么可能是错的?

(换句话说,如果对象仍然存在于上下文中,NSFetchedResultsChangeDelete可以被调用,但是不适合谓词?)

当然changeUpdate而不是changeDelete 。 你只更新了一个值,并没有删除整个项目。 如果你从你的数据库中删除该项目,那么它会调用changeDelete 。 并且它不会显示在新的init之后,因为您的表正在基于此属性进行筛选。

您需要监听wasDeleted并检查属性wasDeleted已更改。 如果是这样,更新您的表视图为您的需要,例如。 删除特定的行。

我做了同样的事情在我的应用程序,并已注意到-controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:newIndexPath委托第一次调用-controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:newIndexPath更改types后跟第二次调用-controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:newIndexPath更改types调用。

NSFetchedResultsChangeUpdate可能是预期的行为,但是没有解释的是为什么第一次调用NSFetchedResultsChangeDelete失败。 你能确认你正确处理这个案子吗?

我有和你一样的问题。

不要使用wasDeleted作为你的属性名称。 处理CoreData对象时,不应使用deleted的变体。

我将我的属性重命名为hidden ,并将其用于谓词。 一切都如你所愿。