2012-08-14 80 views
0

我正在使用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

回答

0

這實際上取決於您在服務器上執行的認證類型。

例如,如果您使用基本的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

相關問題