我是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开发中的最佳实践。
非常感谢你。
答案 0 :(得分:0)
[NSData dataWithContentsOfURL:url];
上述调用是同步的,如果您的代码在主线程中运行,则线程将被阻塞,UI将冻结,直到上述调用返回。 你应该总是尝试异步执行长时间运行(或与网络相关的)操作,在你的情况下我会看一下:
[[[NSURLSession sharedSession]
dataTaskWithURL:url
completionHandler:^(NSData *data,
NSURLResponse *response,
NSError *error) {
// handle response
}] resume];