NSFetchedResultsChangeUpdate已触发而不是NSFetchedResultsChangeDelete

时间:2013-02-04 16:09:30

标签: iphone ios core-data nsfetchedresultscontroller

我有一个以下列方式启动的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

  • 但是,如果我弹出视图并再次启动获取的结果控制器,则该对象不再存在,表明[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"wasDeleted == %@", [NSNumber numberWithBool:NO]]];有效。

  • 在这个NSFetchedResultsChangeUpdate之后,当调用cellForRow时,我打印wasDeleted并将其设置为YES。

这里有什么不妥?

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

3 个答案:

答案 0 :(得分:1)

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

您需要收听NSFetchedResultsChangeUpdate并检查属性wasDeleted是否已更改。如果是这样,请根据您的需要更新您的表视图,例如。删除特定行。

答案 1 :(得分:1)

我在我的应用中做同样的事情,并注意到-controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:newIndexPath委托首先被调用,更改类型为NSFetchedResultsChangeDelete,然后是第二次调用,更改类型为NSFetchedResultsChangeUpdate

NSFetchedResultsChangeUpdate可能是预期的行为,但未解释的原因是缺少NSFetchedResultsChangeDelete的第一次调用。你能否确认你正确处理这个案子?

答案 2 :(得分:1)

我的完全相同问题。

请勿使用wasDeleted作为您的媒体资源名称。在处理CoreData对象时,不应使用deleted的变体。

我将我的属性重命名为hidden,并将其用于谓词。一切都按预期工作。