我试图创建一个看似它有重复键的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是什么所以它忽略了它。
答案 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}
]