5

我相信我跳过了一个重要步骤,或者说我的属性是错误的。在我的应用程序中,使用登录信息创建 POST 对象后,我无法使用映射对象中的此信息(这意味着我得到空值)。我假设在创建发布请求和响应请求后,我应该能够使用我保存的 NSObjectClass 中的值。

我的问题

发布请求映射后如何保存值?如果有人可以为我提供一个如何使用 response.body 值的示例,那将非常有帮助。谢谢你。

我的课程

#import <Foundation/Foundation.h>

@interface AccountsClass : NSObject

@property (nonatomic, strong)           NSString *DeviceType;
@property (nonatomic,strong)            NSString *HardwareId;
@property (nonatomic,strong)            NSString *NickName;
@property (nonatomic,strong)            NSNumber *HelpCreditsBalance;
@property (nonatomic,assign)            BOOL GotRatingCreditBonus;
@property (nonatomic,strong)            NSNumber *AccountId;
@end

这是我用于 POST 请求的方法

-(void)loadPostRequest 
{

    _StoreIdentifierForVendor = [[[UIDevice currentDevice]identifierForVendor]UUIDString];
    _StoreTheModel = [UIDevice currentDevice].model;
    _nickname = usernameTextField.text;

    AccountsClass *AccountInfo = [[AccountsClass alloc] init];
    AccountInfo.NickName = _nickname;
    AccountInfo.HardwareId =_StoreIdentifierForVendor;
    AccountInfo.DeviceType =_StoreTheModel;
    AccountInfo.AccountId =nil;
    AccountInfo.GotRatingCreditBonus = FALSE;
    AccountInfo.HelpCreditsBalance = nil;

    //this is where the POST request begins

    RKObjectMapping *responseMapping = [RKObjectMapping mappingForClass:[AccountsClass class]];
    [responseMapping addAttributeMappingsFromArray:@[@"NickName", @"HardwareId", @"DeviceType",@"AccountId"]];

    NSIndexSet *statusCodes = RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful); // Anything in 2xx
    RKResponseDescriptor *AccountDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:responseMapping method:RKRequestMethodAny pathPattern:nil keyPath:nil statusCodes:statusCodes];


    RKObjectMapping *requestMapping = [RKObjectMapping requestMapping]; // objectClass == NSMutableDictionary
    [requestMapping addAttributeMappingsFromArray:@[@"NickName", @"HardwareId", @"DeviceType",@"AccountId"]];
    // For any object of class Article, serialize into an NSMutableDictionary using the given mapping and nest
    // under the 'article' key path
    RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:requestMapping objectClass:[AccountInfo class] rootKeyPath:nil method:RKRequestMethodAny];
    RKObjectManager *manager = [RKObjectManager managerWithBaseURL:[NSURL URLWithString:@"http://10.15.1.105:XXXX"]];
    [manager addRequestDescriptor:requestDescriptor];
    [manager addResponseDescriptor:AccountDescriptor];


    [manager postObject:AccountInfo path:@"/Accounts" parameters:nil success: ^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
        RKLogInfo(@"Load collection of Articles: %@", mappingResult.array);
        [self performSegueWithIdentifier:@"SegueFromLoginToWelcomeView" sender:self];

        NSLog(@"the firs tobject %@",[mappingResult firstObject]);

    } failure:^(RKObjectRequestOperation *operation, NSError *error) {
        RKLogError(@"Operation failed with error: %@", error);
    }];

    RKLogConfigureByName("*", RKLogLevelTrace); // set all logs to trace,

}

在我的下一个视图控制器中,这就是我试图获得价值的方式。

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    AccountsClass *PrintloginName = [[AccountsClass alloc]init];
    welcomeLabel.text =[PrintloginName NickName];
    NSLog(@"visibility test %@",welcomeLabel.text);

}

控制台日志

2013-11-09 15:44:41.066 GuessTheImage[4913:70b] I restkit:RKLog.m:33 RestKit logging initialized...
2013-11-09 15:44:46.859 GuessTheImage[4913:70b] LoginViewController - Submit Action 
2013-11-09 15:44:46.868 GuessTheImage[4913:70b] T restkit.network:RKObjectRequestOperation.m:148 POST 'http://10.15.1.105.XXXX/Accounts':
request.headers={
    Accept = "application/json";
    "Accept-Language" = "en;q=1, fr;q=0.9, de;q=0.8, zh-Hans;q=0.7, zh-Hant;q=0.6, ja;q=0.5";
    "Content-Type" = "application/x-www-form-urlencoded; charset=utf-8";
    "User-Agent" = "GuessTheImage/1.0 (iPhone Simulator; iOS 7.0.3; Scale/2.00)";
}
request.body=DeviceType=iPhone%20Simulator&HardwareId=0F9B444B-FA08-4422-B154-B8F6861D41FB&NickName=skrillex2
2013-11-09 15:44:47.410 GuessTheImage[4913:f03] D restkit.object_mapping:RKMapperOperation.m:378 Executing mapping operation for representation: {
    AccountId = 1128;
    DeviceType = "iPhone Simulator";
    GotRatingCreditBonus = 0;
    HardwareId = "0F9B444B-FA08-4422-B154-B8F6861D41FB";
    HelpCreditsBalance = 50;
    NickName = skrillex2;
}
 and targetObject: <AccountsClass: 0x8b9aa00>
2013-11-09 15:44:47.412 GuessTheImage[4913:f03] T restkit.object_mapping:RKMapperOperation.m:321 Examining keyPath '<null>' for mappable content...
2013-11-09 15:44:47.413 GuessTheImage[4913:f03] D restkit.object_mapping:RKMapperOperation.m:301 Found mappable data at keyPath '<null>': {
    AccountId = 1128;
    DeviceType = "iPhone Simulator";
    GotRatingCreditBonus = 0;
    HardwareId = "0F9B444B-FA08-4422-B154-B8F6861D41FB";
    HelpCreditsBalance = 50;
    NickName = skrillex2;
}
2013-11-09 15:44:47.414 GuessTheImage[4913:f03] D restkit.object_mapping:RKMapperOperation.m:230 Asked to map source object {
    AccountId = 1128;
    DeviceType = "iPhone Simulator";
    GotRatingCreditBonus = 0;
    HardwareId = "0F9B444B-FA08-4422-B154-B8F6861D41FB";
    HelpCreditsBalance = 50;
    NickName = skrillex2;
} with mapping <RKObjectMapping:0x8b94680 objectClass=AccountsClass propertyMappings=(
    "<RKAttributeMapping: 0x8b8b210 NickName => NickName>",
    "<RKAttributeMapping: 0x8b8b230 HardwareId => HardwareId>",
    "<RKAttributeMapping: 0x8b9cf20 DeviceType => DeviceType>",
    "<RKAttributeMapping: 0x8b9cf40 AccountId => AccountId>"
)>
2013-11-09 15:44:47.415 GuessTheImage[4913:f03] D restkit.object_mapping:RKMappingOperation.m:851 Starting mapping operation...
2013-11-09 15:44:47.415 GuessTheImage[4913:f03] T restkit.object_mapping:RKMappingOperation.m:852 Performing mapping operation: <RKMappingOperation 0x8cad4c0> for 'AccountsClass' object. Mapping values from object {
    AccountId = 1128;
    DeviceType = "iPhone Simulator";
    GotRatingCreditBonus = 0;
    HardwareId = "0F9D844B-FA08-4422-B254-B8F6861F41FB";
    HelpCreditsBalance = 50;
    NickName = skrillex2;
} to object <AccountsClass: 0x8b9aa00> with object mapping (null)
2013-11-09 15:44:47.416 GuessTheImage[4913:f03] T restkit.object_mapping:RKMappingOperation.m:440 Mapping attribute value keyPath 'NickName' to 'NickName'
2013-11-09 15:44:47.416 GuessTheImage[4913:f03] T restkit.object_mapping:RKMappingOperation.m:429 Found transformable value at keyPath 'NickName'. Transforming from class '__NSCFString' to 'NSString'
2013-11-09 15:44:47.417 GuessTheImage[4913:f03] T restkit.object_mapping:RKMappingOperation.m:475 Skipped mapping of attribute value from keyPath 'NickName to keyPath 'NickName' -- value is unchanged (skrillex2)
2013-11-09 15:44:47.417 GuessTheImage[4913:f03] T restkit.object_mapping:RKMappingOperation.m:440 Mapping attribute value keyPath 'HardwareId' to 'HardwareId'
2013-11-09 15:44:47.417 GuessTheImage[4913:f03] T restkit.object_mapping:RKMappingOperation.m:429 Found transformable value at keyPath 'HardwareId'. Transforming from class '__NSCFString' to 'NSString'
2013-11-09 15:44:47.418 GuessTheImage[4913:f03] T restkit.object_mapping:RKMappingOperation.m:475 Skipped mapping of attribute value from keyPath 'HardwareId to keyPath 'HardwareId' -- value is unchanged (0F9D844B-FA08-4422-B254-B8F6861F41FB)
2013-11-09 15:44:47.418 GuessTheImage[4913:f03] T restkit.object_mapping:RKMappingOperation.m:440 Mapping attribute value keyPath 'DeviceType' to 'DeviceType'
2013-11-09 15:44:47.420 GuessTheImage[4913:f03] T restkit.object_mapping:RKMappingOperation.m:429 Found transformable value at keyPath 'DeviceType'. Transforming from class '__NSCFString' to 'NSString'
2013-11-09 15:44:47.420 GuessTheImage[4913:f03] T restkit.object_mapping:RKMappingOperation.m:475 Skipped mapping of attribute value from keyPath 'DeviceType to keyPath 'DeviceType' -- value is unchanged (iPhone Simulator)
2013-11-09 15:44:47.421 GuessTheImage[4913:f03] T restkit.object_mapping:RKMappingOperation.m:440 Mapping attribute value keyPath 'AccountId' to 'AccountId'
2013-11-09 15:44:47.421 GuessTheImage[4913:f03] T restkit.object_mapping:RKMappingOperation.m:429 Found transformable value at keyPath 'AccountId'. Transforming from class '__NSCFNumber' to 'NSNumber'
2013-11-09 15:44:47.421 GuessTheImage[4913:f03] T restkit.object_mapping:RKMappingOperation.m:460 Mapped attribute value from keyPath 'AccountId' to 'AccountId'. Value: 1128
2013-11-09 15:44:47.421 GuessTheImage[4913:f03] D restkit.object_mapping:RKMappingOperation.m:920 Finished mapping operation successfully...
2013-11-09 15:44:47.422 GuessTheImage[4913:f03] D restkit.object_mapping:RKMapperOperation.m:404 Finished performing object mapping. Results: {
    "<null>" = "<AccountsClass: 0x8b9aa00>";
}
2013-11-09 15:44:47.425 GuessTheImage[4913:4f0f] T restkit.network:RKObjectRequestOperation.m:218 POST 'http://10.15.1.105:XXXX/Accounts' (201 Created / 1 objects) [request=0.5414s mapping=0.0155s total=0.5654s]:
response.headers={
    "Cache-Control" = "no-cache";
    "Content-Length" = 178;
    "Content-Type" = "application/json; charset=utf-8";
    Date = "Sat, 09 Nov 2013 23:44:41 GMT";
    Expires = "-1";
    Pragma = "no-cache";
    Server = "Microsoft-IIS/8.0";
    "Set-Cookie" = "ARRAffinity=c390b30098dd5ae543210f9431ef79195d0285397a590e0175ce17a5951ea041;Path=/;Domain=e.azurewebsites.net, WAWebSiteSID=af7b9190880945d5938dd9725eecb045; Path=/; HttpOnly";
    "X-AspNet-Version" = "4.0.30319";
    "X-Powered-By" = "ASP.NET";
}
response.body={"DeviceType":"iPhone Simulator","HardwareId":"0F9D844B-FA08-4422-B254-B8F6861F41FB","NickName":"skrillex2","HelpCreditsBalance":50,"GotRatingCreditBonus":false,"AccountId":1128}
2013-11-09 15:44:47.425 GuessTheImage[4913:70b] I app:LoginViewController.m:107 Load collection of Articles: (
    "<AccountsClass: 0x8b9aa00>"
)
2013-11-09 15:44:47.430 GuessTheImage[4913:70b] the firs tobject <AccountsClass: 0x8b9aa00>
2013-11-09 15:44:47.440 GuessTheImage[4913:70b] visibility test (null)
4

1 回答 1

3

当你这样做时:

AccountsClass *PrintloginName = [[AccountsClass alloc]init];

您创建一个与任何映射实例无关的全新帐户类实例。

您应该拦截 segue(通过prepareForSegue:sender:在触发 segue 的视图控制器上实现)以获取目标视图控制器,然后将映射对象(from mappingResult)传递给它。

于 2013-11-10T00:20:02.883 回答