objective-c restkit restkit-0.20

objective c - RestKit 0.20-CoreData: error: Error al llamar al inicializador designado en la clase NSManagedObject



objective-c restkit-0.20 (2)

Ahora ha leído la documentación de la clase para RKObjectManager que aclara el manejo del manejo de la red de AF de la URL base. Si hubiera leído esto primero, me habría ahorrado algo de tiempo, y también de hacer comentarios irrelevantes con respecto a las rutas en los ejemplos de RestKit.

Tuvo problemas para hacer coincidir una combinación de asignaciones de objetos y entidades, incluida una serie de asignaciones de objetos con una ruta de clave nula y una URL diferente, y encontró esta respuesta muy útil para determinar la causa del problema que se describe a continuación, que puede haber contribuido a que otros experimenten problemas similares.

Me encontré con un nuevo problema que parece que no puedo encontrar una manera de evitar ... Aquí está mi código RestKit, siguiendo el ejemplo de Datos básicos de Twitter:

// // RESTKIT // // restkit object manager NSString *baseURL = @"http://test1.website.com"; RKObjectManager *objectManager = [RKObjectManager managerWithBaseURL:[NSURL URLWithString:baseURL]]; // enable activity indicator [AFNetworkActivityIndicatorManager sharedManager].enabled = YES; // managed object model NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"AppName" withExtension:@"momd"]; NSManagedObjectModel *managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; // NSLog(@"managed object model: %@", managedObjectModel); // managed object store RKManagedObjectStore *managedObjectStore = [[RKManagedObjectStore alloc] initWithManagedObjectModel:managedObjectModel]; objectManager.managedObjectStore = managedObjectStore; // NSLog(@"managed object store: %@", managedObjectStore); // persistent store NSError *error; NSString *storePath = [RKApplicationDataDirectory() stringByAppendingPathComponent:@"AppName.sqlite"]; NSPersistentStore *persistentStore = [managedObjectStore addSQLitePersistentStoreAtPath:storePath fromSeedDatabaseAtPath:nil withConfiguration:nil options:nil error:&error]; if (error) { NSLog(@"unresolved error %@, %@", error, [error userInfo]); abort(); } // NSLog(@"persistent store coordinator: %@", managedObjectStore.persistentStoreCoordinator); // NSLog(@"persistent store: %@", persistentStore); // managed object contexts [managedObjectStore createManagedObjectContexts]; // NSLog(@"managed object context: %@", managedObjectStore.mainQueueManagedObjectContext); // managed object cache managedObjectStore.managedObjectCache = [[RKInMemoryManagedObjectCache alloc] initWithManagedObjectContext:managedObjectStore.mainQueueManagedObjectContext]; // NSLog(@"mangaged object cache: %@", managedObjectStore.managedObjectCache); // // entity mapping // // album entity mapping RKEntityMapping *albumEntityMapping = [RKEntityMapping mappingForEntityForName:@"Album" inManagedObjectStore:managedObjectStore]; albumEntityMapping.identificationAttributes = @[ @"identifier" ]; [albumEntityMapping addAttributeMappingsFromDictionary:@{ @"title" : @"title" }]; // // response descriptor // // album response descriptor [objectManager addResponseDescriptor:[RKResponseDescriptor responseDescriptorWithMapping:albumEntityMapping pathPattern:[NSString stringWithFormat:@"/albums/display/%@/%@", userInfo[@"userID"], userInfo[@"apiKey"]] keyPath:nil statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)]];

Solicito la información de la API a través de una clase UITableViewController:

- (void)loadObjectsFromResourcePath:(NSString *)resourcePath; { [[RKObjectManager sharedManager] getObjectsAtPath:resourcePath parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) { NSLog(@"mapping result: %@", [mappingResult array]); [self stopLoading]; } failure:^(RKObjectRequestOperation *operation, NSError *error) { NSLog(@"error: %@", error); [self stopLoading]; }]; }

Sin embargo, con este código obtengo los siguientes errores:

2012-12-05 17:08:14.830 AppName Alpha[1310:907] I restkit:RKLog.m:34 RestKit logging initialized... 2012-12-05 17:08:15.107 AppName Alpha[1310:907] resource path: albums/display/102/drrrbSAt6RFLsgHaKiiB6kBIyYRyzxLYinL84Kba 2012-12-05 17:08:15.113 AppName Alpha[1310:907] I restkit.support:RKMIMETypeSerialization.m:115 JSON Serialization class ''RKNSJSONSerialization'' detected: Registering for MIME Type ''application/json 2012-12-05 17:08:15.118 AppName Alpha[1310:1603] I restkit.network:RKHTTPRequestOperation.m:141 GET ''http://test1.AppName.com/albums/display/102/drrrbSAt6RFLsgHaKiiB6kBIyYRyzxLYinL84Kba'' 2012-12-05 17:08:15.122 AppName Alpha[1310:907] error (null), (null) 2012-12-05 17:08:35.333 AppName Alpha[1310:3e13] I restkit.network:RKHTTPRequestOperation.m:158 GET ''http://test1.AppName.com/albums/display/102/drrrbSAt6RFLsgHaKiiB6kBIyYRyzxLYinL84Kba'' (200) 2012-12-05 17:08:35.351 AppName Alpha[1310:1507] CoreData: error: Failed to call designated initializer on NSManagedObject class ''AppName Album'' 2012-12-05 17:08:35.355 AppName Alpha[1310:1507] *** Terminating app due to uncaught exception ''NSUnknownKeyException'', reason: ''[<AppName 0x1c579380> valueForUndefinedKey:]: the entity (null) is not key value coding-compliant for the key "Title".'' *** First throw call stack: (0x39e503e7 0x38ea9963 0x39e500d5 0x371f8d81 0x3276cc1d 0xbf545 0xc00f5 0xc0ab9 0xc44c5 0x32791299 0xb738b 0xb6e5f 0xb7ca5 0xb8343 0xb895b 0x32791299 0xf96ef 0xf8c4b 0x32791299 0x328097f7 0x32c38793 0x32c3c657 0x32c3c7d9 0x3312a7f1 0x3312a684) libc++abi.dylib: terminate called throwing an exception

Puede tomar un pico en el objeto JSON devuelto aquí: http://test1.AppName.com/albums/display/102/drrrbSAt6RFLsgHaKiiB6kBIyYRyzxLYinL84Kba


Esto indica que se intentó crear un objeto sin llamar al inicializador de Core Data apropiado, lo que probablemente significa que está obteniendo una instancia de RKObjectRequestOperation lugar de una RKManagedObjectRequestOperation .

Sospecho que el descriptor de respuesta no coincide con la URL, lo que hace que seleccione el tipo de operación de solicitud de objeto incorrecto. Puede verificar esto colocando un punto de interrupción en appropriateObjectRequestOperationWithObject:method:path:parameters: en las líneas que dicen:

NSArray *matchingDescriptors = RKFilteredArrayOfResponseDescriptorsMatchingPath(self.responseDescriptors, requestPath); BOOL containsEntityMapping = RKDoesArrayOfResponseDescriptorsContainEntityMapping(matchingDescriptors); BOOL isManagedObjectRequestOperation = (containsEntityMapping || [object isKindOfClass:[NSManagedObject class]]);

Esta lógica es la responsable de seleccionar el tipo de operación creada. Verifique que los Descriptores matchingDescriptors contengan el descriptor de respuesta que espera y luego verifique los valores de los siguientes dos booleanos. Mi conjetura es que RKFilteredArrayOfResponseDescriptorsMatchingPath no está devolviendo lo que espera.