迭代NSDictionary时未定义的键

时间:2011-07-28 13:55:41

标签: iphone objective-c

我对iPhone / Objective-c编程很陌生。我正在努力解决一个对我没有意义的问题。我正在编写一个应用程序,作为代码的一部分,将使用休息服务。我写的使用ASIHttpRequest库进行Post调用的方法如下所示:

- (NSString *) httpPostStringResponseUrl:(NSURL *)url:(NSDictionary *)args{
    ASIFormDataRequest  *request = [[[ASIFormDataRequest  alloc]  initWithURL:url] autorelease];

    NSArray *keys = [args allKeys];

    NSEnumerator *e = [args keyEnumerator];
    NSString* object;
    while (object = [e nextObject]) {
            NSLog(@"Adding to args key: %@", object);
        [request setPostValue:[keys valueForKey:object] forKey:object];
    }

    NSLog(@"Starting http POST request");
    [request startSynchronous];
    NSString *response = [request responseString];
    return response;
}

这个想法是传入参数及其值的字典,并将它们用作POST请求的参数。但是,当我运行此代码时,我得到一个NSUnknownKeyException。

这对我没有意义。我正在进行的字典的唯一访问是使用迭代器提供的键。那么,它们如何成为迭代器的一部分而不是有效的密钥呢?

为了完整性,这里是我调用上述函数的代码:

NSMutableDictionary *params = [[[NSMutableDictionary alloc] init] autorelease];
NSURL *url = [[[NSURL alloc] initWithString:@"http://myURL"] autorelease];

[params setValue:@"user" forKey:@"Username"];
[params setValue:@"1234" forKey:@"Password"];

NSString *response = [web httpPostStringResponseUrl:url :params];

NSLog(@"Response is \"%@\"", response);

2 个答案:

答案 0 :(得分:0)

问题是您正在尝试在keys数组中查找键的值,而不是在args字典中。尝试这样的事情:

for (NSString *key in args) {
        NSLog(@"Adding to args key: %@", key);
    [request setPostValue:[args objectForKey:key] forKey:key];
}

注意,这也使用fast enumeration而不是显式(慢)枚举。

答案 1 :(得分:-1)

我可以看到你的方法签名是错误的,我不知道该代码是如何编译的。

- (NSString *) httpPostStringResponseUrl:(NSURL *)url:(NSDictionary *)args

上述行被打破。这应该是正确的:

- (NSString *) httpPostStringResponseUrl:(NSURL *)url params:(NSDictionary *)args

电话也应该是这样的:

NSString *response = [web httpPostStringResponseUrl:url params:params];