0

我正在使用 NSURLConnection 和 NSURLConnectionDelegate 协议将带有从 iPhone 客户端输入的用户名和密码的 URL 发布到服务器。服务器收到 URL 后,服务器上提供的 Web 服务将填充一些 JSON 格式的数据并将其发送回 iPhone 客户端。

我的 WebserviceDelegate 类使用 NSURLConnectionDelegate 协议。

    @implementation WebserviceDelegate

    - (id)initWithURL:(NSURL *)url
    {
        if (self = [super init])
        {
            responseData = [NSMutableData data];
            NSURLRequest *request = [NSURLRequest requestWithURL:url];

            connection = [NSURLConnection connectionWithRequest:request delegate:self];

            [connection start];
        }

        return self;
    }

    ...

    @end

现在我想验证我从服务器获得的响应是​​否告诉我我是否已登录。为此,Web 服务发送的数据将具有一个名为“status”的字典键。如果“status”为“true”,则表示登录成功。如果看到“false”,则表示登录失败。

但在 iPhone 端,我不知道如何实现上述逻辑,因为:

该请求是异步的,因此当我尝试在自定义方法中验证状态键时,我得到空值。(responseDict 是在 .h 文件中定义的变量,它的值是从

(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data

在我的 WebserviceDelegate 类中)

    NSString *status = [responseDict objectForKey:@"status"];
    NSLog(@"status = %@", status);

    if ([@"true" isEqualToString:status]) {
        return YES;
    }
    else {
        return NO;
    }
4

1 回答 1

0

这实际上取决于您在服务器中执行的身份验证类型。

例如,如果您使用基本的 http 身份验证,您可以轻松地在标头中发送凭据,如果成功则返回 200,如果失败则返回 4xx。如果您正在执行其他类型的身份验证,例如您在此处描述的身份验证,这意味着只要您连接,无论结果如何,您都会收到 200 响应,因此您将按照您所说的阅读字典。

在这种情况下,除了等待响应执行以下操作之外别无他法。您可以采取几种方法,例如:

在委托方法中执行您想要执行的任何操作,以便如果身份验证成功,则在响应到达时完成。

您还可以在另一个线程中发送同步请求,并在那里执行以下任务。由于它不在主线程中,因此不会阻塞 gui,并且由于验证用户不应该花费那么长时间,因此不会对该线程产生太大影响。

(但是您可以做的最简单的事情就是让成功或不成功的路径从委托方法中执行)

于 2012-08-14T06:47:28.037 回答