【问题标题】:Restkit-Failed to call designated initializer on NSManagedObject classRestkit-无法在 NSManagedObject 类上调用指定的初始化程序
【发布时间】:2016-11-18 16:37:27
【问题描述】:

我将 Restkit 用于扩展 NSManagedObject 的类。 我知道休息套件本身具有从网络获取保存到核心数据的功能。但是,由于以下原因,我无法使用该功能:

  • 我的应用程序将从套接字和 rest kit 获取数据,因此我需要一个集中位置来保存/删除逻辑。
  • 我的服务器没有确认休息协议,所以很多时候我必须发送一个 POST 请求,即使我真的想删除服务器中的某些内容。

所以我想做的是让我的模型类扩展 nsmanaged 对象,并在我想要的时候保存它。但我得到这个错误:

CoreData:错误:无法调用指定的初始化程序 NSManagedObject 类

有没有办法解决这个问题?

我是这样从服务器获取的:

@implementation API_Login
+(void)performLoginWithEmail:(NSString*)email
                withPassword:(NSString*)password
                     success:(void (^)(Token* user) )success
                     failure:failureblock failure{

    RKObjectManager * objectManager = [APIHelper getRestObjectManager];
    RKObjectMapping *tokenMapping = [RKObjectMapping mappingForClass:[Token class]];

//add mapping for token
    [tokenMapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:nil toKeyPath:@"token"]];
    RKResponseDescriptor *responseDescriptor =
    [RKResponseDescriptor responseDescriptorWithMapping:tokenMapping
                                                 method:RKRequestMethodGET
                                            pathPattern:nil
                                                keyPath:nil
                                            statusCodes:[NSIndexSet indexSetWithIndex:200]];

    [objectManager addResponseDescriptor:responseDescriptor];


//    add mapping for error
    RKObjectMapping *errorMapping = [RKObjectMapping mappingForClass:[Error class]];
    [errorMapping addAttributeMappingsFromDictionary:@{@"message":@"message",@"badRequest":@"badRequest"}];
    RKResponseDescriptor *errorResponseDescriptor =
    [RKResponseDescriptor responseDescriptorWithMapping:errorMapping
                                                 method:RKRequestMethodGET
                                            pathPattern:nil
                                                keyPath:nil
                                            statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassClientError)];

    [objectManager addResponseDescriptor:errorResponseDescriptor];



    NSDictionary *queryParams =  @{@"email" : email,
                                   @"password" : password,
                                   };

    [objectManager postObject:nil
                         path:@"/users/api/login"
                   parameters:queryParams
                      success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {

                          Token* token =  (Token*)[mappingResult firstObject] ;
//                          [AppDelegateHandle setToken:token];
                          success(token);
                      } failure:^(RKObjectRequestOperation *operation, NSError *error) {
                          NSArray* e = [[error userInfo] objectForKey:RKObjectMapperErrorObjectsKey];
                          Error *err = (Error*)[e objectAtIndex:0];
                          NSLog(@"%@",[err.badRequest allValues] );
                          failure(operation,error);
                      }];


}
@end

我的 Token 类看起来像:

@interface Token : NSManagedObject
@property NSString* token;
@end

我的 api 响应看起来像:

{
  "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOjEsImlzcyI6Imh0dHA6XC9cL3JlbWluZGVyLmRldlwvdXNlcnNcL2FwaVwvbG9naW4iLCJpYXQiOjE0Njg1OTM3NjYsImV4cCI6MTQ2OTE5Mzc2NiwibmJmIjoxNDY4NTkzNzY2LCJqdGkiOiIxMDc3ZjBhY2ViYTFjOWZjZWNhYjkyMzYyOTA0ZmI4NSJ9.I6FHJLCCHr3EHQa8HgaDqxQMjF1HVyA5AymPjvBGDrM"
}

当我将 Token 更改为扩展 NSObject 而不是 NSManagedObject 时,一切正常。可能是什么问题?

【问题讨论】:

    标签: ios core-data restkit


    【解决方案1】:

    发生这种情况是因为您使用的是RKObjectMapping 而不是RKEntityMapping,如果您使用的是NSManagedObject 的子类,则这是必需的。

    如果您不打算将 NSManagedObject 的子类直接添加到上下文中,则不能使用它。

    如果您的请求只是有一个令牌,那么我可能不会打扰 RestKit,但在一般情况下,我会映射到 NSDictionary,键与您的托管对象类相同,然后当您想要创建您的托管对象,您可以这样做并使用setValuesForKeysWithDictionary: 将数据“导入”到它们。

    【讨论】:

    • 是否可以决定何时保存数据?我不想一味的保存来触发数据。
    • 否,RestKit 会在完成映射后保存。您可以保存到不同的上下文/持久存储中,然后再合并。看来要花很多力气去...
    猜你喜欢
    • 1970-01-01
    • 2013-08-17
    • 2016-01-22
    • 2014-10-19
    • 1970-01-01
    • 1970-01-01
    • 2013-01-18
    • 2023-03-12
    相关资源
    最近更新 更多