2015-09-14 3 views
0

Я испытываю Restkit, используя версию 0.25.0. Я точно следил за тем, что говорит документация для сопоставления отношений, но по некоторым причинам у меня есть пустой результат отображения! Но когда я удаляю объект отношений (данные), у меня есть результат сопоставления !!! Но, конечно, результат сопоставления не содержит данных, которые мне нужны, которые я добавил как отношения. я следовал примеру, они имеют в этой ссылке:
https://github.com/RestKit/RestKit/wiki/Object-mapping#relationshipsRestkit - отображение отношений не работает

Когда я распечатать JSON с помощью отладчика, вот вывод:

{ 
    "status": "success", 
    "data": { 
     "id": 11, 
     "provider": "email", 
     "uid": "[email protected]", 
     "name": null, 
     "nickname": null, 
     "image": null, 
     "email": "[email protected]", 
     "country": "United States", 
     "city": "Milan, Metropolitan City of Milan, Italy", 
     "gender": "m", 
     "birthday": "2015-06-25" 
    } 
} 

Вот код, как я делаю запрос:

RKObjectManager *manager = [RKObjectManager sharedManager]; 

RKLogConfigureByName("RestKit/ObjectMapping", RKLogLevelTrace); 

RKObjectMapping *jsonResponseMapping = [JSONResponse mappingObject]; 
RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:jsonResponseMapping 
                         method:RKRequestMethodAny 
                        pathPattern:@"/auth/sign_in" 
                         keyPath:nil 
                        statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)]; 
[manager addResponseDescriptor:responseDescriptor]; 

NSDictionary *parameters = @{ 
          @"email": user.email, 
          @"password": user.password 
          }; 
[manager postObject:user path:@"/auth/sign_in" parameters:parameters success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) { 
    NSDictionary *headerFields = operation.HTTPRequestOperation.response.allHeaderFields; 
    [self updateUserInfoForResponse:[mappingResult firstObject] headerFields:headerFields]; 
    if (successBlock) { 

     successBlock([mappingResult firstObject]); 
    } 
} failure:^(RKObjectRequestOperation *operation, NSError *error) { 
    if (failureBlock) { 
     failureBlock(error.userInfo[RKObjectMapperErrorObjectsKey][0], error); 
    } 
}]; 

.m класса JSONResponse:

+ (RKObjectMapping *)mappingObject { 
    RKObjectMapping *jsonResponseMapping = [RKObjectMapping mappingForClass:[JSONResponse class]]; 
    [jsonResponseMapping addAttributeMappingsFromDictionary:@{ 
                @"status": @"status", 
                @"errors": @"errors", 
                }]; 

    RKRelationshipMapping *userRelationShip = [RKRelationshipMapping relationshipMappingFromKeyPath:@"data" toKeyPath:@"data" withMapping:[User mappingObject]]; 
    [jsonResponseMapping addPropertyMapping:userRelationShip]; 

    return jsonResponseMapping; 
} 

.h Из класса JSONResponse:

#import <RestKit/Restkit.h> 
#import <Foundation/Foundation.h> 
#import "User.h" 

@interface JSONResponse : NSObject 

@property (nonatomic, copy) NSString *status; 
@property (nonatomic) User *data; 
@property (nonatomic, copy) NSDictionary *errors; 

/** 
@function mappingObject 

@return RKObjectMapping mapping for the json response 
*/ 
+ (RKObjectMapping *)mappingObject; 

@end 

.m пользовательского класса

#import "User.h" 

@implementation User 

+ (RKObjectMapping *)mappingObject { 
    RKObjectMapping *userMapping = [RKObjectMapping mappingForClass:[User class]]; 
    [userMapping addAttributeMappingsFromDictionary:@{ 
                @"email": @"email", 
                @"password": @"password", 
                @"gender": @"gender", 
                @"birthday": @"dateOfBirth", 
                @"city": @"city", 
                @"country": @"country" 
                }]; 
    return userMapping; 
} 

@end 

.h класса User

@class RKObjectMapping; 

@interface User : NSObject 

@property (nonatomic, copy) NSString *email; 
@property (nonatomic, copy) NSString *password; 
@property (nonatomic, copy) NSString *gender; 
@property (nonatomic, copy) NSString *dateOfBirth; 
@property (nonatomic, copy) NSString *city; 
@property (nonatomic, copy) NSString *country; 

/** 
    @function mappingObject 

    @return RKObjectMapping mapping object for user 
*/ 
+ (RKObjectMapping *)mappingObject; 

@end 

Существует ничего плохого в моих моделей объектов? Правильно ли установлена ​​связь? У меня есть свойство данных в JSONResponse, и JSON правильно содержит keyPath data. Так что я довольно смущен, почему у меня есть результаты, когда я удаляю свои отношения и почему результат сопоставления пуст, когда у меня есть отношения. Это даже не входит в failCallback, операция успешна, результат пуст.

Любые идеи?

EDIT: Вот журналы:

2015-09-15 07:27:50.649 testRestkit[53698:3448725] D restkit.object_mapping:RKPropertyInspector.m:154 Cached property inspection for Class 'JSONResponse': { 
    data = "<RKPropertyInspectorPropertyInfo: 0x7facf2c5fa00>"; 
    status = "<RKPropertyInspectorPropertyInfo: 0x7facf2c5f7d0>"; 
} 
2015-09-15 07:27:50.650 testRestkit[53698:3448725] D restkit.object_mapping:RKPropertyInspector.m:154 Cached property inspection for Class 'User': { 
    email = "<RKPropertyInspectorPropertyInfo: 0x7facf2c60680>"; 
} 
2015-09-15 07:27:50.820 testRestkit[53698:3448725] I restkit.network:RKObjectRequestOperation.m:150 POST 'http://sandrotchikovani.com/test.php' 
2015-09-15 07:27:51.236 testRestkit[53698:3448938] D restkit.object_mapping:RKMapperOperation.m:407 Executing mapping operation for representation: { 
    data =  { 
     email = "[email protected]"; 
    }; 
    status = success; 
} 
and targetObject: <User: 0x7facf2c05820> 
2015-09-15 07:27:51.237 testRestkit[53698:3448938] T restkit.object_mapping:RKMapperOperation.m:350 Examining keyPath '<null>' for mappable content... 
2015-09-15 07:27:51.237 testRestkit[53698:3448938] D restkit.object_mapping:RKMapperOperation.m:330 Found mappable data at keyPath '<null>': { 
    data =  { 
     email = "[email protected]"; 
    }; 
    status = success; 
} 
2015-09-15 07:27:51.237 testRestkit[53698:3448938] D restkit.object_mapping:RKMapperOperation.m:433 Finished performing object mapping. Results: { 
} 

это не странно, что в журнале, это говорит and targetObject: <User: 0x7facf2c05820>? Когда я удаляю связь, появляется результат сопоставления и объект targetObject, отображается «null».

+0

Что скажет журнал трассировки? И каков полный результат преобразования? – Wain

+0

Привет @Wain! Спасибо за помощь. Я обновил вопрос выше, я добавил журналы. У меня есть этот тестовый ответ URL: http://sandrotchikovani.com/test.php. Он возвращает простой JSON, который я хочу отобразить. Демо-проект также доступен: http://sandrotchikovani.com/testRestkit.zip Демонстрация имеет только один контроллер, делая запрос с помощью RestKit. – manonthemoon

ответ

1

Вы вызываете postObject:..., и когда вы сделаете это, RestKit вернется к исходному объекту. В этом случае это пользователь, и именно поэтому вы видите журнал and targetObject: <User: 0x7facf2c05820>.

Проще всего сделать это, чтобы настроить JSONResponse так, чтобы вы опубликовали его и получили от него ответ. Он уже имеет нужный user, поэтому достаточно простого изменения дескриптора запроса, чтобы вытащить поля пользователя.

В качестве альтернативы существует множество других вопросов о сопоставлении с другим объектом после публикации.

+0

Большое спасибо @Wain за ваш ответ, вы спасли мой день. Я думаю, что это очень плохо, что 'RestKit' пытается сопоставить ответ с классом объекта, который я пытался отправить. В принципе, это означает, что он полностью игнорирует мой «RKResponseDescriptor», а также когда я не добавляю свои отношения, на самом деле есть результат сопоставления ... Это делает его еще более запутанным. Во всяком случае, я просто отправляю свой контент с помощью 'parameters' ... Он хорошо использует отображение, которое я хочу сейчас. – manonthemoon