我有一个以下列方式启动的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?)
答案 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
,并将其用于谓词。一切都按预期工作。