AFIncrementalStore简单获取以崩溃终止

时间:2013-07-22 19:58:21

标签: ios core-data afincrementalstore

我正在使用AFIncrementalStore设置一个非常简单的NSIncrementalStore示例。

我们的想法是在AppDelegate中设置一个NSManagedObjectContext(使用Apple提供的普通模板,对我的IncrementalStore进行更改),执行不带谓词或排序描述符的提取和NSLog获取的一个实体对象。

在我要求任何实体属性之前,一切都很有效。它崩溃了以下消息:

2013-07-22 16:34:46.544 AgendaWithAFIncrementalStore[82315:c07] -[_NSObjectID_id_0 eventoId]: unrecognized selector sent to instance 0x838b060
2013-07-22 16:34:46.545 AgendaWithAFIncrementalStore[82315:c07] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[_NSObjectID_id_0 eventoId]: unrecognized selector sent to instance 0x838b060'

我的xcdatamodeld已正确设置。在委托上生成并导入NSManagedObject类。当我在NSLog之前执行断点时,我可以看到获取的对象ID。网络服务正在向我提供正确的数据。

我的AppDelegate代码:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    ... 
    [self.window makeKeyAndVisible];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(remoteFetchHappened:) name:AFIncrementalStoreContextDidFetchRemoteValues object:self.managedObjectContext];

    NSEntityDescription *entityDescription = [NSEntityDescription
                                          entityForName:@"Agenda" inManagedObjectContext:self.managedObjectContext];

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    fetchRequest.entity = entityDescription;
    fetchRequest.predicate = nil;
    NSError *error;

    [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];

    return YES;
}

// Handle the notification posted when the webservice returns objects
- (void)remoteFetchHappened:(NSNotification *)aNotification
{
    NSArray *fetchResult = [[aNotification userInfo] objectForKey:@"AFIncrementalStoreFetchedObjectIDs"];
    Agenda *agenda = (Agenda *)[fetchResult lastObject];

    // THIS IS WHERE IT BREAKS...
    NSLog(@"Agenda: %@", agenda.eventoId);
}

关于如何制作这段代码的任何想法都会返回我要求的属性?

1 个答案:

答案 0 :(得分:0)

AFNetworking为您提供托管对象ID,即NSManagedObjectID的实例。您无法在其上查找托管对象属性值 - 您必须首先获取该ID的托管对象。这就是_NSObjectID_id_0在错误信息中的含义 - 你想要得到的 eventoIdNSManagedObjectID,并且不知道那是什么。

通过在托管对象上下文中查找来获取托管对象。像

这样的东西
NSError *error = nil;
NSManagedObject *myObject = [context existingObjectWithID:objectID error:error];
if (myObject != nil) {
    // look up attribute values on myObject
}