2016-07-15 1 views
0

NSManagedObject를 확장하는 클래스에 대해 Restkit을 사용하고 있습니다. 휴식 키트 자체에 네트워크 가져 오기의 핵심 데이터를 저장하는 기능이 있다는 것을 알고 있습니다. 그러나 다음과 같은 이유로이 기능을 사용할 수 없습니다 :Restkit - NSManagedObject 클래스에서 지정된 초기화 프로그램을 호출하지 못했습니다.

  • 내 응용 프로그램은 소켓에서 데이터와 나머지 키트를 가져올 것이므로 논리를 저장/삭제하기위한 중앙 집중식 위치가 필요합니다.
  • 내 서버가 프로토콜을 확인하지 못하므로 실제로 서버에서 무언가를 삭제할 때도 POST 요청을 보내야합니다.

그래서 Model 클래스가 nsmanaged 개체를 확장하고 싶을 때 저장하고 싶습니다. 하지만이 오류가 발생합니다 :

CoreData: error: Failed to call designated initializer on NSManagedObject class

이 문제를 해결하는 방법이 있습니까?

이 같은 서버에서 가져 오는 오전 :

@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:@"https://stackoverflow.com/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" 
} 

토큰이 NSManagedObject 대신 NSObject를 확장하면 모든 것이 잘 동작합니다. 무엇이 문제 일 수 있습니까?

답변

1

NSManagedObject 하위 클래스를 사용하는 경우 RKEntityMapping 대신 RKObjectMapping을 사용해야하므로 이러한 현상이 발생합니다.

컨텍스트에 직접 추가하지 않으려면 NSManagedObject의 하위 클래스를 사용할 수 없습니다.

귀하의 요청에 단순히 토큰이 있다면 나는 RestKit을 사용하지 않을 것입니다. 그러나 일반적으로 관리되는 객체 클래스와 동일한 키를 사용하여 NSDictionary으로 매핑 한 다음 생성하려고 할 때 귀하가 관리 할 수있는 객체를 가져오고 setValuesForKeysWithDictionary:을 사용하여 데이터를 가져올 수 있습니다.

+0

언제 데이터를 유지할 것인지 결정할 수 있습니까? 나는 맹목적으로 데이터를 저장하는 것을 원하지 않는다. –

+0

아니요, RestKit은 매핑이 완료된 후 저장합니다. 다른 컨텍스트/영구 저장소에 저장 한 다음 나중에 병합 할 수 있습니다. 같이 가려고 많은 노력을하고있는 것처럼 보입니다. – Wain