我是iOS世界的新手,也是Objective - C编程的新手。
我正在为iPad和iPhone做一个基本的iOS应用程序,有一个初始登录屏幕。有时它工作得很好,但当我点击登录按钮时,它只是冻结屏幕并阻止应用程序执行。我认为这是ajax进程的问题,但就像我说的,我是新的…
这是我调用API检查凭据的代码:
NSString *password = @"XXXXXXXXXX";
NSString *joinString = [NSString stringWithFormat:@"%@%@%@%@%@",@"http://www.example.com?view=checks&tmpl=json&c=",input,@"&p=",password,@"&onlymail"];
NSLog(@"calling: %@", joinString);
NSURL *url = [NSURL URLWithString:joinString];
NSData *data = [NSData dataWithContentsOfURL:url];
NSString *ret = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSString *returned = [ret stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceCharacterSet]];
NSLog(@"returned: %@", returned);
if([returned length] != 0 && ![returned isEqual:@""] && ![returned isEqual:NULL])
{
NSLog(@"Connection Successful: %@", ret);
return returned;
}
else
{
NSLog(@"Connection could not be made");
return @"";
}
更新代码
NSString *password = @"XXXXXXXXX";
NSString *joinString = [NSString stringWithFormat:@"%@%@%@%@%@",@"http://www.example.com/index.php?view=checks&tmpl=json&c=",input,@"&p=",password,@"&onlymail"];
NSURL *url = [NSURL URLWithString:joinString];
[NSData dataWithContentsOfURL:url];
[[[NSURLSession sharedSession]
dataTaskWithURL:url
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
{
if (data != nil && error == nil)
{
NSString *returned = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
if([returned length] != 0 && ![returned isEqual:@""] && ![returned isEqual:NULL])
{
NSLog(@"Connection Successful: %@", returned);
}
else
{
NSLog(@"Connection could not be made");
}
}
else
{
NSLog(@"error: %@",error.localizedDescription);
}
}] resume];
我知道我的代码是不完美的,所以请给我一些建议关于解决这个问题或者只是为了提高我在iOS开发中的最佳实践。
非常感谢。
[NSData dataWithContentsOfURL:url];
上面的调用是同步的,如果你的代码在主线程中运行,线程将被阻塞,UI将冻结,直到上面的调用返回。您应该始终尝试异步执行长时间运行(或与网络相关)的操作,在您的情况下,我会查看:
[[[NSURLSession sharedSession]
dataTaskWithURL:url
completionHandler:^(NSData *data,
NSURLResponse *response,
NSError *error) {
// handle response
}] resume];