9

我有一个 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?)

4

3 回答 3

1

我和你有完全相同的问题。

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

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

于 2013-02-13T07:00:45.407 回答
1

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

NSFetchedResultsChangeUpdate如果属性wasDeleted更改,您将需要在那里侦听并检查。如果是这样,请根据您的需要更新您的表格视图,例如。删除特定行。

于 2013-02-07T14:26:56.100 回答
1

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

NSFetchedResultsChangeUpdate可能是预期的行为,但无法解释的是为什么第一次调用 withNSFetchedResultsChangeDelete丢失。你能确认你正确地处理了这个案子吗?

于 2013-02-10T12:48:05.053 回答