簡體   English   中英

Restkit無法在NSManagedObject類上調用指定的初始化程序

[英]Restkit-Failed to call designated initializer on NSManagedObject class

我將Restkit用於擴展NSManagedObject的類。 我知道rest kit本身具有從網絡獲取保存到核心數據的功能。 但是,由於以下原因,我無法使用該功能:

  • 我的應用程序將從套接字以及rest kit提取數據,因此我需要一個集中的位置來保存/刪除邏輯。
  • 我的服務器無法確認是否保留協議,因此即使我確實要刪除服務器中的某些內容,也必須發送POST請求很多次。

所以我想做的是讓我的Model類擴展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

我的令牌類如下所示:

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

和我的api響應看起來像:

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

當我更改令牌以擴展NSObject而不是NSManagedObject時,一切正常。 可能是什么問題?

發生這種情況是因為您使用的是RKObjectMapping而不是RKEntityMapping ,如果您使用的是NSManagedObject的子類, NSManagedObject

如果您不打算將其直接添加到上下文中, NSManagedObject不能使用NSManagedObject的子類。

如果您的請求僅包含一個令牌,那么我可能不會理會RestKit,但在一般情況下,我會使用與您的托管對象類相同的鍵將其映射到NSDictionary ,然后在您要創建托管對象時可以這樣做,並使用setValuesForKeysWithDictionary:將數據“導入”到他們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM