我正在使用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 *)数据
在我的WebserviceDelegate类中)
NSString *status = [responseDict objectForKey:@"status"];
NSLog(@"status = %@", status);
if ([@"true" isEqualToString:status]) {
return YES;
}
else {
return NO;
}
答案 0 :(得分:0)
这实际上取决于您在服务器中执行的身份验证类型。
例如,如果您使用基本的http身份验证,则可以轻松地在标头中发送凭据,如果成功则返回200,如果不是则返回4xx。如果您正在进行其他类型的身份验证,例如您在此处描述的身份验证,则意味着无论结果如何,只要您已连接,您将获得200响应,因此您将按照您的说法阅读字典。
在这种情况下,除了等待响应执行以下操作之外别无他法。例如,您可以采用多种方法:
在委托方法中执行您想要执行的任何操作,以便在身份验证成功时,在响应到达时完成。
您还可以在另一个线程中发送同步请求,并在那里执行以下任务。由于它不在主线程中,因此不会阻止gui,因为对用户进行身份验证不应该花那么长时间就不会影响这个线程。
(但是,您可以做的最简单的事情就是从委托方法中执行成功或不成功的路径)