NSFetchedResultsChangeUpdate已触发而不是NSFetchedResultsChangeDelete

Nat*_* R. 9 iphone core-data nsfetchedresultscontroller ios

我有一个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];
Run Code Online (Sandbox Code Playgroud)

一些事实:

  • wasDeleted是MyEntity的NSNumber属性(BOOL)

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

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

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

这可能有什么不对?

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

小智 1

当然changeUpdate也不是changeDelete。您仅更新了一个值,并未删除整个项目。如果您从数据库中删除该项目,那么它将调用changeDelete. 并且在新的初始化之后不会显示它,因为您的表正在根据此属性进行过滤。

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

  • relikd,当然不是“changeUpdate”,因为这个特定的更改应该从“NSFRC”中删除该对象。如果您更新对象属性,并且此更改应删除该对象,我应该收到“changeDelete”。奇怪的是:一方面,如果我再次执行performFetch:,则该对象不再存在;另一方面,如果我再次执行performFetch:,则该对象不再存在。另一方面,调用的更改是“changeUpdate”。 (2认同)