如何验证用户已经使用NSURLConnectionDelegate登录
我正在使用NSURLConnection和NSURLConnectionDelegate协议来发布URL从用户名和密码输入从iPhone客户端到服务器。一旦服务器接收到URL,服务器上提供的Web服务将以JSON格式填充一些数据并将其发送回iPhone客户端。如何验证用户已经使用NSURLConnectionDelegate登录
我的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服务发送会有所谓的“地位”一本字典的关键数据。如果“状态”为“真”,则表示登录成功。如果看到“假”,则意味着无法登录。
但在iPhone端,我不知道如何实现上述逻辑,因为:
请求是异步的,所以当我尝试验证一个自定义的方法,我得到空值的状态的关键。 (responseDict是在.h文件中定义的变量,它的值是从
(无效)连接检索到:(NSURLConnection的*)连接didReceiveData:(NSData的 在我WebserviceDelegate *)数据
类)
NSString *status = [responseDict objectForKey:@"status"];
NSLog(@"status = %@", status);
if ([@"true" isEqualToString:status]) {
return YES;
}
else {
return NO;
}
这实际上取决于您在服务器上执行的认证类型。
例如,如果您使用基本的http身份验证,您可以轻松地在头中发送凭据,如果成功则返回200,如果不成功则返回4xx。如果您正在进行其他类型的身份验证(如您在此处描述的身份验证),则意味着无论结果如何,只要您连接,就会得到200响应,因此您将按照您的说法阅读字典。
在这种情况下,除了等待响应执行以下任何操作之外,没有别的办法。例如,您可以采取以下几种方法:
在委托方法中执行任何您想要执行的操作,以便如果验证成功,则在响应到达时完成。
您也可以在另一个线程中发送同步请求,并在那里执行以下任务。由于它不在主线程中,所以它不会阻塞gui,并且由于验证用户不应该花费那么长时间,所以它不会影响这个线程。
(但你可以做最简单的事情是简单地让成功或不成功的路径,您可以通过委托方法执行)
括号中的最后一句是什么意思? – newguy 2012-08-14 07:07:09
不会改变你的代码,只是移动你正在做的任何事情,如果登录是成功的委托方法。(或将其移动到一个函数,然后使该函数得到执行它的登录是成功的) – Pochi 2012-08-14 07:19:11
因此,如果我想执行一个segue到另一个屏幕,我需要移动代码performSegueWithIdentifier:发送者:委托方法?而通过委托方法,你的意思是我正在使用的,这是连接:willSendRequestForAuthenticationChallenge? – newguy 2012-08-14 07:31:37
How'bout'连接:didReceiveAuthenticationChallenge:'? – 2012-08-14 05:18:49
...以及最后一个if-else尽可能不可读。使用'return [status isEqualToString:@“true”];'代替。 – 2012-08-14 05:19:47
不是连接:didReceiveAuthenticationChallenge在iOS 5中已弃用?我正在使用连接:willSendRequestForAuthenticationChallenge,我仍然试图找出如何正确使用它来验证登录。 – newguy 2012-08-14 06:19:42