我开始研究iPhone和iPad应用程序,但仍然不知道如何做某些事情。
我正在开发一个具有登录屏幕的应用程序。当我使用另一种应用程序语言开发时,我有一个名为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 Post
中进行ViewController.m
?
答案 0 :(得分:1)
Objective-C中的设计不应与您更熟悉的任何其他语言有任何不同。
除少数例外情况外,网络上的交互应该是异步的,以避免阻止UI。您已经在控制器中实现了异步NSURLConnection
API。您的部分问题可能与哪个班级应该调用Web服务有关。通常,我避免让视图控制器直接进行这些调用。它导致了臃肿的视图控制器类。相反,就像你开发的任何语言的WebService
服务类一样,我会在那里打电话。然后,您需要一种将响应状态报告回控制器的方法。正如另一位回答者建议的那样,您可以声明一个WebServiceDelegate
协议并在您的控制器中实现该协议。因此,您的WebService
实例充当您为与Web服务交互而创建的NSURLConnection
实例的委托,并且视图控制器充当它生成的WebService
实例的委托。一切都是异步的;并且您避免让视图控制器直接负责处理Web服务。也就是说,一些开发人员不反对在视图控制器实现中直接实现Web服务调用。
或者,您可以在WebService
类上声明完成块,并在NSURLConnection
完成(或失败,或超时等)时执行该块,例如
最后,您在发布的代码中实现NSURLConnectionDelegate
协议并未考虑使用必须汇编的数据块多次调用connection:didReceiveData:
的可能性。最好创建一个NSMutableData
ivar,每次调用connection:didReceiveData:
时都会向其附加数据。最后,您可以在connectionDidFinishLoading
中进行处理。 (并实施connection:didFailWithError:
。)
答案 1 :(得分:0)
[[NSURLConnection alloc] initWithRequest:request delegate:self];
将触发异步连接。你应该声明一个协议(相当于java中的接口)并在你的ViewController中实现它。完成异步方法后,调用协议的方法之一并传递您想要的任何数据