2013-07-30 19 views
0

我開始在iPhone和iPad應用上工作,但仍不知道如何做某些事情。如何在Objective C中正確分發方法C

我正在開發一個具有登錄屏幕的應用程序。當我使用另一種應用程序語言進行開發時,我有一個名爲WebService的類,其中我負責與Web服務進行通信並返回輸出或布爾值。

但在Objective C我不知道該怎麼做。

這裏是我的代碼:

ViewController.m

- (IBAction)login:(id)sender { 
    /* Verify if username and password are correct */ 
    Boolean loginCorrecto = [[WebService alloc] login:self.textFieldUsername.text password:self.textFieldPassword.text]; 

    /* If login is correct, go to another view */ 
    if (loginCorrecto) { 
     CupsViewController *cupsView = [self.storyboard instantiateViewControllerWithIdentifier:@"cupsViewController"]; 
     [self.navigationController pushViewController:cupsView animated:YES]; 
    } 
    /* If not, show an error message */ 
    else { 

    } 
} 

WebService.m

- (Boolean)login:(NSString *)username password:(NSString *)password 
{ 
    /* HTTP POST */ 
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL: [NSURL URLWithString:URL_CUPS]]; 

    [request setHTTPMethod:@"POST"]; 

    NSString *postString = [NSString stringWithFormat: @"username=%@&password=%@", username, password]; 

    [request setValue:[NSString stringWithFormat:@"%d", [postString length]] forHTTPHeaderField:@"Content-length"]; 

    [request setHTTPBody:[postString dataUsingEncoding:NSUTF8StringEncoding]]; 

    [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
} 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)theData { 
    NSDictionary* jsonArray=[NSJSONSerialization 
        JSONObjectWithData:theData 
        options:0 
        error:nil]; 

    //Get values of response of web service 
    status = [jsonArray objectForKey:@"status"]; 
    message = [jsonArray objectForKey:@"message"]; 

    if([status isEqualToString:@"Ok"]) { 
     id results = [jsonArray objectForKey:@"results"]; 

     if(results != [NSNull null]) { 
      for(int r = 0; r < [results count]; r++) { 
      //Get more values 
      } 
     } 
    } 
    else { 
     //Show error 
    } 
} 

目標

所以我想要的是登錄方法WebService.m,如果status等於「Ok」,則返回true。但是當該方法結束時,狀態仍然是nil。我需要做什麼?有什麼辦法可以做到這一點,我有我需要做的或我必須做Http PostViewController.m

+0

不涉及你的問題,如果你剛剛開始新的開發,然後嘗試'AFNetworking'。處理您的API請求很簡單和容易。 https://github.com/AFNetworking/AFNetworking – icodebuster

回答

1

Objective-C中的設計應該與其他你熟悉的語言不同。

除少數例外,網絡上的交互應該是異步的,以避免阻塞UI。您已在控制器中實施異步NSURLConnection API。你的問題的一部分可能涉及哪個類應該調用Web服務。一般來說,我避免讓視圖控制器直接進行這些調用。它導致了臃腫的視圖控制器類。相反,就像您開發的任何語言的WebService服務類一樣,我會在那裏打電話。然後,您需要將響應狀態報告給控制器。正如另一位回答者所建議的那樣,您可能會聲明一個WebServiceDelegate協議並在您的控制器中實施該協議。因此,您的WebService實例充當您創建的NSURLConnection實例的代理,以便與Web服務進行交互,並且視圖控制器充當其生成的WebService實例的代理。一切都保持異步;並且避免讓視圖控制器直接負責處理Web服務。也就是說,一些開發人員不反對直接在視圖控制器實現中實現Web服務調用。

或者,您可以在WebService類中聲明完成塊,並在NSURLConnection完成(或失敗或超時等)時執行該塊。

最後,您在發佈的代碼中執行的NSURLConnectionDelegate協議沒有考慮到可能會使用您必須組裝的大量數據調用connection:didReceiveData:多次。最好創建一個NSMutableData ivar,每次調用connection:didReceiveData:時向其添加數據。最後,您可以在connectionDidFinishLoading中進行處理。 (並執行connection:didFailWithError:。)

0

[[NSURLConnection alloc] initWithRequest:request delegate:self];將觸發異步連接。你應該聲明一個協議(相當於java中的接口)並在你的ViewController中實現它。當你的異步方法完成後,調用你的協議的一種方法,並傳遞你想要的任何數據。

+0

我不知道我是否理解你。我必須創建一個協議(將其命名爲PX),我的ViewController必須實現PX。 PX有'login method',它有我的'WebService.m'和另一個方法(MY),在我的情況下,它將查找登錄方法的結果,變量'status'。是嗎? – Lyd