NSDictionary具有相同键的多个值?

时间:2014-04-08 09:53:53

标签: objective-c nsdictionary

我试图创建一个看似它有重复键的NSDictionary,但值不同。

这是因为我发送的数据是Web服务 - 它接受多格式的帖子消息,需要这样的值:

SomeKey: value1
SomeKey: value2
SomeKey value 3

而不是这样:

SomeKey: value1, value2, value 3... 

我在NSArray中有值 - 但是我不知道如何将它们放入看起来像上面的NSDictionary中 - 可能是某种对象?

修改

所以,这是我如何向主服务器发出Web服务请求。

网络库:AFNetworking 2.0

来自 viewControllerA

此代码在上一个Web服务请求完成后运行:

NSDictionary *results = [[BBDataStore sharedDataStore]fetchuserIdResult];
            BBSeller *seller = [[BBSeller alloc]init];

            seller.alias = results[@"userAlias"];
            seller.userId = results[@"userid"];

            [self.sellerListIds addObject:seller.userId];
            [self.sellerListAliases addObject:seller];

这会将数据拆分为两个数组:

self.sellerListIds

对于我真正感兴趣的userId。它只是NSString

self.sellerListAliases

只是在屏幕上向用户显示用户名 - 仅此而已。我需要将此数据发送到的Web服务,只查看userIds。

对 - 然后我调用方法

[self setupSearchParameters:seller.userId];

看起来像这样:

    -(void)setupSearchParameters: (NSString *)userId
{

    self.sellerListidString = userId;

    [self.parameters setObject:self.sellerListidString forKey:self.typeOfSellerSearch];
}

这允许一个userId用于密钥:self.typeOfSellerSearch

现在,当用户按下确认按钮以执行Web服务搜索时,它会使用self.parameters字典调用我的数据中的方法,并将其他值添加到现有字典中 - 其中包括其他搜索关键字。

最后,它调用网络请求方法 - 如下所示:

-(void)fetch:(NSDictionary *)urlParameters
{
    if (!self.webService.isBusy){

        BBWebService *webService = [[BBWebService alloc]initWithURL:self.url RequestType:GET_REQUEST UrlParameters:urlParameters];

        self.webService = webService;
        self.webService.webServiceId = wsID;
        [self.webService setDelegate:self]; 

    }

}

调用此方法:

    -(instancetype)initWithURL:(NSString *)url RequestType:(NSString *)requestType  UrlParameters:(NSDictionary *)urlParameters
{

    [self getSessionManager];

    if ([requestType isEqualToString:@"GET"]){

        self.isBusy = YES;
        [self.manager GET:url parameters:urlParameters
                  success:^(NSURLSessionDataTask *task, id responseObject){

                      NSHTTPURLResponse *response = (NSHTTPURLResponse *)task.response;

                      int statusCode = (int)response.statusCode;

                      [self requestDone:responseObject StatusCode:statusCode];

                  }failure:^(NSURLSessionDataTask *task, NSError *error){

                      NSHTTPURLResponse *response = (NSHTTPURLResponse *)task.response;

                      int statusCode = (int)response.statusCode;
                      [self requestFailed:error StatusCode:statusCode];

                  }];
return self;
}

从那里AFNetworking 2.0负责将参数构造到URL中并发出请求。当它恢复成功时,我会获取数据并解析它。

现在 - 这是有效的。但是,我需要它来处理多个键/值对。

如果我尝试@ Selvin的代码,网络服务无法正常运行。我与Java Develeopers进行了交谈,他们说Web服务期望这样:

键/值1 关键/价值2 关键/价值3 .....

它无法解决这个问题:

键/值1,值2,值3 ///

它似乎也无法解决这个问题:

key2 /一些随机值 - > key / value1

因为它不知道key2是什么所以它忽略了它。

2 个答案:

答案 0 :(得分:1)

NSArray *paramsArray = @[@{@"SomeKey": @"value1"},
                         @{@"SomeKey": @"value2"},
                         @{@"SomeKey": @"value3"},
                         @{@"OtherKey": @"value4"}];

    [paramsArray enumerateObjectsUsingBlock:^(NSDictionary *paramDict, NSUInteger idx, BOOL *stop){
        [paramDict enumerateKeysAndObjectsUsingBlock:^(NSString *key,NSString *value, BOOL *stop){
            //apply the key and value on the HTTP request
        }];
    }];

您使用的框架接受NSDictionary格式。您需要编辑框架以满足您的需求。

修改

您需要编辑应用参数的AFNetworking代码。您的initWithURL方法将urlParameters作为NSDictionary。但根据我的回答,你需要通过NSArray传递NSDIctionary元素的集合。

为了完成这项工作需要做的是,在AFNetworking代码中,必须检查和处理urlParameters。如果urlParameters是NSDictionary,那么让代码按原样运行。如果它是NSArray,那么你需要自己做“应用HTTP参数”。

答案 1 :(得分:0)

你能以NSDictionary在数组中的方式制作吗?

例如:

[
{SomeKey:value1},
{SomeKey:value2},
{SomeKey:value3}
]