如何验证用户已经使用NSURLConnectionDelegate登录

如何验证用户已经使用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; 
    } 
+0

How'bout'连接:didReceiveAuthenticationChallenge:'? – 2012-08-14 05:18:49

+0

...以及最后一个if-else尽可能不可读。使用'return [status isEqualToString:@“true”];'代替。 – 2012-08-14 05:19:47

+0

不是连接:didReceiveAuthenticationChallenge在iOS 5中已弃用?我正在使用连接:willSendRequestForAuthenticationChallenge,我仍然试图找出如何正确使用它来验证登录。 – newguy 2012-08-14 06:19:42

这实际上取决于您在服务器上执行的认证类型。

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

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

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

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

(但你可以做最简单的事情是简单地让成功或不成功的路径,您可以通过委托方法执行)

+0

括号中的最后一句是什么意思? – newguy 2012-08-14 07:07:09

+0

不会改变你的代码,只是移动你正在做的任何事情,如果登录是成功的委托方法。(或将其移动到一个函数,然后使该函数得到执行它的登录是成功的) – Pochi 2012-08-14 07:19:11

+0

因此,如果我想执行一个segue到另一个屏幕,我需要移动代码performSegueWithIdentifier:发送者:委托方法?而通过委托方法,你的意思是我正在使用的,这是连接:willSendRequestForAuthenticationChallenge? – newguy 2012-08-14 07:31:37