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를 확장하면 모든 것이 잘 동작합니다. 무엇이 문제 일 수 있습니까?
언제 데이터를 유지할 것인지 결정할 수 있습니까? 나는 맹목적으로 데이터를 저장하는 것을 원하지 않는다. –
아니요, RestKit은 매핑이 완료된 후 저장합니다. 다른 컨텍스트/영구 저장소에 저장 한 다음 나중에 병합 할 수 있습니다. 같이 가려고 많은 노력을하고있는 것처럼 보입니다. – Wain