RestKit 0.20 - CoreData:错误:无法在NSManagedObject类上调用指定的初始化程序

时间:2012-12-05 23:12:12

标签: objective-c restkit restkit-0.20

我遇到了一个我无法找到解决办法的新问题......这是我的RestKit代码,遵循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)]];

我是通过UITableViewController类从API请求信息:

- (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];
    }];
}

但是,使用此代码我会收到以下错误:

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

您可以在此处返回JSON对象的峰值:     http://test1.AppName.com/albums/display/102/drrrbSAt6RFLsgHaKiiB6kBIyYRyzxLYinL84Kba

2 个答案:

答案 0 :(得分:47)

这表示尝试创建对象时未调用相应的Core Data初始值设定项,这可能意味着您获得的是RKObjectRequestOperation实例,而不是RKManagedObjectRequestOperation

我怀疑响应描述符无法与URL匹配,这导致它选择了错误的对象请求操作类型。您可以通过在appropriateObjectRequestOperationWithObject:method:path:parameters:中的断点处查看以下行来检查:

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

这个逻辑负责选择创建的操作类型。检查matchingDescriptors是否包含您期望的响应描述符,然后检查下两个布尔值的值。我的猜测是RKFilteredArrayOfResponseDescriptorsMatchingPath没有回复你的期望。

答案 1 :(得分:1)

现在已经阅读了RKObjectManager的类文档,该文档阐明了对基本URL的AF网络处理的处理。如果我先读过这篇文章,那么可以节省一些时间,也可以在RestKit示例中对路径做出不相关的评论。

存在与对象和实体映射的混合匹配的问题,包括具有nil密钥路径和不同URL的多个对象映射,并且发现此答案对于确定下面描述的问题的原因非常有用,这可能导致其他人遇到类似问题问题。