0

我开始使用 iPhone 和 iPad 应用程序,但仍然不知道如何做一些事情。

我正在开发一个具有登录屏幕的应用程序。当我使用另一种应用程序语言进行开发时,我有一个名为的类WebService,我在其中完成与 Web 服务通信并返回输出或布尔值的所有工作。

但是在Objective C我不知道该怎么做。

这是我的代码:

视图控制器.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 {

    }
}

网络服务.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
    }
}

目标

所以我想要的是登录方法,如果等于“Ok” WebService.m,则返回true 。status但是当该方法完成时,状态仍然是nil. 我需要做什么?有什么方法可以用我的课程或我必须参加的课程来做到这一点Http PostViewController.m

4

2 回答 2

1

Objective-C 中的设计应该与您更熟悉的任何其他语言没有任何不同。

除了少数例外,网络上的交互应该是异步的,以避免阻塞 UI。您已经NSURLConnection在控制器中实现了异步 API。您的部分问题可能与哪个类应该调用 Web 服务有关。一般来说,我避免让视图控制器直接进行这些调用。它导致臃肿的视图控制器类。相反,就像您WebService使用任何语言开发的服务类一样,我会在那里进行此类调用。然后,您需要一种将响应状态报告回控制器的方法。正如另一个回答者所建议的那样,您可以声明一个WebServiceDelegate协议并在您的控制器中实现该协议。因此,您的WebService实例充当NSURLConnection您创建的用于与 Web 服务交互的实例,视图控制器充当WebService它生成的实例的委托。一切都保持异步;并且避免让视图控制器直接负责处理 Web 服务。也就是说,一些开发人员并不反对直接在视图控制器实现中实现 Web 服务调用。

或者,您可以在您的类上声明一个完成块,并在完成(或失败,或超时等)WebService时执行该块,例如NSURLConnection

最后,您NSURLConnectionDelegate在发布的代码中对协议的实现没有考虑到connection:didReceiveData:可能多次调用您必须组装的数据块的可能性。最好创建一个NSMutableDataivar,每次connection:didReceiveData:调用时都向它附加数据。最后,您可以在connectionDidFinishLoading. (并实施connection:didFailWithError:。)

于 2013-07-30T16:46:12.860 回答
0

[[NSURLConnection alloc] initWithRequest:request delegate:self];触发异步连接。你应该声明一个协议(相当于java中的接口)并在你的ViewController中实现它。完成异步方法后,调用协议的方法之一并传递所需的任何数据

于 2013-07-30T15:46:09.453 回答