Core data 如何在插入到FetchResultsController后获取NSManagedObject对象ID(ObjectID.isTemporaryID==NO)?

Core data 如何在插入到FetchResultsController后获取NSManagedObject对象ID(ObjectID.isTemporaryID==NO)?,core-data,Core Data,我正在使用CoreData,我希望在将新的NSManagedObject插入/保存到上下文后获得一个objectID,而不是临时的 在我的vc保存中: NSManagedObjectContext *context = ((AppDelegate *)[UIApplication sharedApplication].delegate).managedObjectContext; EventMO *newEvent = [NSEntityDescription insertNewObjectFo

我正在使用CoreData,我希望在将新的NSManagedObject插入/保存到上下文后获得一个objectID,而不是临时的

在我的vc保存中:

NSManagedObjectContext *context = ((AppDelegate *)[UIApplication sharedApplication].delegate).managedObjectContext;
EventMO *newEvent = [NSEntityDescription insertNewObjectForEntityForName:@"EventMO" inManagedObjectContext:context];            
if ([context save:&error]) {
    [self dismissViewControllerAnimated:YES completion:nil];
}
在使用fetchResultViewController和tableView的主视图控制器中,从哪里可以获取新保存的NSmanagedObject objectID,即objectID.isTemporaryID==NO

我尝试了[_fetchedResultsControllerobjectatindexpath:newPath];在[[self tableView]endUpdates]之后;但似乎不起作用。错误:

po [self.fetchedResultsController objectAtIndexPath:_insertedIndexPath]
error: Execution was interrupted, reason: internal ObjC exception breakpoint(-3)..
The process has been returned to the state before expression evaluation.
此外,我不确定endUpdates后isTemporaryID是否为否

编辑

我猜endupdates不应该是临时id,我想通过以下方式进行检查:

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
        [[self tableView] endUpdates];
EventMO *event   = [_fetchedResultsController objectAtIndexPath:indexPath];
//po this event, get the error below
    }
我弄错了

error: Execution was interrupted, reason: internal ObjC exception breakpoint(-3)..
The process has been returned to the state before expression evaluation.
编辑2 我有以下两个课程:

@interface Event : NSObject
@interface EventMO : NSManagedObject
My UITableViewCell子类只有一个属性事件:

@interface CountCell : UITableViewCell
@property (nonatomic, strong) Event *event;
@end

我的tableView取决于用户是否注册。如果核心数据应使用已注册事件,或应在本地使用EventMO。因此,在创建并保存新的EventMO之后,我需要CountCell来显示它。因此,我必须将EventMO转换为Event来显示它

保存后,将获得一个持久对象ID。。。除非您没有直接连接到PSC,而是有一个父MOC

基本上,当从直接连接到PSC的MOC保存时,您只能获得持久对象ID

但是,可以随时使用NSManagedObjectContext方法将其转换为持久对象ID

编辑

首先,如果您的代码依赖于是否知道对象ID是临时的,那么您应该重新考虑您的逻辑。。。这听起来不对,除非您正在编写一些特殊的核心数据代码

其次,如果您的MOC有一个PSC而不是父MOC,则必须在保存上下文之前查询objectID及其临时/永久状态。为什么不这样做,保存上下文

NSLog(@"before save: %@", [moc registeredObjects]);
BOOL result = [moc save:&error];
NSLog(@"after save: %@", [moc registeredObjects]);
您将看到所有对象的ID。。。您可以从视觉上区分临时的和永久的

临时的看起来像这样

<NSManagedObject: 0x7f8834836e10> (
  entity: Foo;
  id: 0x7f8834836e70 <x-coredata:///Foo/tECDD46E2-3D01-4E5D-BCE8-1DD8DB2138A512>;
  data: { identifier = 8; }),
<NSManagedObject: 0x7f8834836e10> (
  entity: Foo;
  id: 0x7f8834c231e0 <x-coredata://38B5921E-4638-42FD-AD94-78555561DBA7/Foo/p2>;
  data: { identifier = 8; }),
永久的看起来像这样

<NSManagedObject: 0x7f8834836e10> (
  entity: Foo;
  id: 0x7f8834836e70 <x-coredata:///Foo/tECDD46E2-3D01-4E5D-BCE8-1DD8DB2138A512>;
  data: { identifier = 8; }),
<NSManagedObject: 0x7f8834836e10> (
  entity: Foo;
  id: 0x7f8834c231e0 <x-coredata://38B5921E-4638-42FD-AD94-78555561DBA7/Foo/p2>;
  data: { identifier = 8; }),
保存后,所有对象都应具有永久ID

请记住,FRC将在MOC更改时获得更新,而不仅仅是在保存时


您在问题末尾引用的异常看起来像是错误的indexPath。

这意味着不直接连接到PSC是什么意思?我有一个[_managedObjectContextsetPersistentStoreCoordinator:coordinator];仅在AppDelegate.m上,并且也只使用一个属于AppDelegate.m的managedObjectContext。在[context save:&error]之后,我的tableview cellforrow我检查了NSMangeObject实例,它是临时的。谢谢它连接到一个PSC。保存到PSC后,您将获得永久ID。请发布一些代码来演示您看到的内容。我编辑了我的问题。事实上,如果我使用GetainPermanentidsForObjects方法,它工作得很好。但我只是想知道为什么保存后仍然不是一个永久的id。你能检查我的新编辑为什么我使用它吗?我不知道我的逻辑是否正确,谢谢!不管怎样,你都能提供很大的帮助!谢谢
<NSManagedObject: 0x7f8834836e10> (
  entity: Foo;
  id: 0x7f8834c231e0 <x-coredata://38B5921E-4638-42FD-AD94-78555561DBA7/Foo/p2>;
  data: { identifier = 8; }),